本文主要是介绍pthead 创建与销毁详解 pthread_create pthread_join pthread_exit pthread_detach,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
pthead 创建与销毁
pthread_create
-
函数原型:
int pthread_create(pthread_t *thread, const pthread_attr_t *attr,void *(*start_routine)(void *), void *arg);
thread
:指向pthread_t
类型的指针,用于存储新线程的标识符。attr
:指向pthread_attr_t
类型的指针,用于设置新线程的属性,为 NULL 则使用默认属性。start_routine
:指向函数的指针,新线程的运行入口。arg
:传递给start_routine
的参数,可以为 NULL。- 返回值:成功返回 0,失败返回错误代码。
-
创建一个新的线程,并以
start_routine
指定的函数作为入口而开始执行。 -
新线程可以通过以下方式停止:
- 自身调用
pthread_exit
,其结束状态码可以在主进程中通过pthread_join
获得; - 从
start_routine
返回,返回值等同于pthread_exit
的结束状态码; - 在主线程中调用
pthread_cancel
; - 主进程中的任何线程调用
exit
函数或者主进程从main
返回。
- 自身调用
-
新线程的
cpu time clock
为0
。 -
新线程将继承其父进程的 cpu 亲和性。
pthread_exit
-
函数原型:
void pthread_exit(void *retval);
- retval:线程的退出状态,可以是任意类型的指针,可以为 NULL。
-
立即终止当前线程的执行,并将
retval
作为线程的退出状态返回给调用者。线程的退出状态可以通过其他线程使用pthread_join
函数来获取。
pthread_join
-
函数原型:
int pthread_join(pthread_t thread, void **retval);
thread
:要等待的线程标识符,其必须为 join-able。retval
:指向指针的指针,用于存储被等待线程的返回值,可以为 NULL。- 返回值:成功返回 0,失败返回错误代码。
-
阻塞调用它的线程,等待指定线程的结束,并获取其返回值。如果指定的线程早已结束,则立即返回。
-
以下代码演示了
pthread_create,pthread_join,pthread_exit
的使用:#include <stdio.h> #include <unistd.h> #include <pthread.h>#define NEED_EXIT_STATUS (0)void *thread_func(void *arg) {printf("thread started\n");int *value = (int *)arg;// 输出为 10printf("received value: %d\n", *value);// 修改传入的值*value = 100;sleep(1);#if NEED_EXIT_STATUS// 需要返回结束状态码, 以下两种方法都可以,推荐使用 return// pthread_exit((void *)value);return value; #else// 不需要返回结束状态码,以下两种方法都可以,推荐使用 return// pthread_exit(NULL);return NULL; #endif }int main() {pthread_t tid;int value = 10;// 创建一个新线程,并以 thread_func 作为入口函数,传递给 thread_func 函数的参数为 valueint ret = pthread_create(&tid, NULL, thread_func, (void *)&value);if (ret != 0) {fprintf(stderr, "pthread_create error: %d\n", ret);return -1;}printf("created new thread with id %ld\n", tid);#if NEED_EXIT_STATUS// 等待线程结束并获取退出状态void *thread_retval;ret = pthread_join(tid, &thread_retval);if (ret != 0) {fprintf(stderr, "pthread_join error: %d\n", ret);return -1;}int *retval = (int *)thread_retval;printf("thread exited with value: %d\n", *retval); #else// 等待线程结束不获取退出状态ret = pthread_join(tid, NULL);if (ret != 0) {fprintf(stderr, "pthread_join error: %d\n", ret);return -1;}printf("thread %ld exit normal\n", tid); #endifreturn 0; }
pthread_detach
-
函数原型:
int pthread_detach(pthread_t thread);
- thread:要设置为分离状态的线程标识符。
- 返回值:成功返回 0,失败返回错误代码。
-
将指定线程设置为“分离状态”,使得该线程结束时能够自动释放其资源。
-
一旦线程被设置为分离状态,就不能再调用
pthread_join
等待它的结束。 -
以下代码演示了
pthread_detach
的使用:#include <stdio.h> #include <unistd.h> #include <pthread.h>#define NEED_EXIT_STATUS (0)void *thread_func(void *arg) {printf("thread started\n");sleep(1);printf("thread exited\n");return NULL; }int main() {pthread_t tid;int ret = pthread_create(&tid, NULL, thread_func, NULL);if (ret != 0) {fprintf(stderr, "pthread_create error: %d\n", ret);return -1;}printf("created new thread with id %ld\n", tid);ret = pthread_detach(tid);if (ret != 0) {fprintf(stderr, "pthread_detach error: %d\n", ret);return -1;}printf("thread detached, main thread exited\n");return 0; }
这篇关于pthead 创建与销毁详解 pthread_create pthread_join pthread_exit pthread_detach的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!