【PTHREAD】线程状态
1 链接态线程
int pthread_join(pthread_t thread, void **retval);
int pthread_tryjoin_np(pthread_t thread, void **retval);
int pthread_timedjoin_np(pthread_t thread, void **retval, const struct timespec *abstime);
-
pthread_join
- 阻塞函数
- 参数
retval
用于接收线程的返回值。如果不需要,设置为NULL
- 调用该函数的线程将等待参数
thread
所标识的线程的退出 - 参数
thread
所标识的线程的资源在调用pthread_join
时释放
-
pthread_tryjoin_np
- 该函数执行非阻塞的链接。
- 如果调用该函数时,参数
thread
指定的线程已终止,则其功能与pthread_join
相同 - 如果调用该函数时,参数
thread
指定的线程尚未终止,则该函数以错误的方式立即返回
-
pthread_timedjoin_np
- 带超时时间的链接。
- 如果线程尚未终止,且线程在参数
abstime
指定的时间内结束,则其功能与pthread_join
相同 - 如果超时在线程终止前到期,则函数返回调用超时错误。
2 案例:链接态线程使用之pthread_join
-
源码
#include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <pthread.h> void *start_routine(void *ptr) { printf("子线程(%lu)开始运行...\n", pthread_self()); sleep(3); printf("子线程(%lu)即将退出...\n", pthread_self()); return (void*)"9999"; } int main(int argc, char const *argv[]) { printf("主线程(%lu)开始运行...\n", pthread_self()); pthread_t thread_id; pthread_create(&thread_id, NULL, start_routine, NULL); void *retval = NULL; pthread_join(thread_id, &retval); printf("子线程的返回值为:%s\n", (const char*)retval); printf("主线程(%lu)即将退出...\n", pthread_self()); exit(EXIT_SUCCESS); }
-
输出
主线程(140647242364736)开始运行…
子线程(140647242360576)开始运行…
子线程(140647242360576)即将退出…
子线程的返回值为:9999
主线程(140647242364736)即将退出…
3 案例:链接态线程使用之pthread_tryjoin_np
-
源码
#include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <pthread.h> void *start_routine(void *ptr) { printf("子线程(%lu)开始运行...\n", pthread_self()); sleep(3); printf("子线程(%lu)即将退出...\n", pthread_self()); return (void*)"9999"; } void TEST_Join(int timeout) { printf("\n"); pthread_t thread_id; pthread_create(&thread_id, NULL, start_routine, NULL); sleep(timeout); void *retval = NULL; int ret = pthread_tryjoin_np(thread_id, &retval); printf("函数返回值 :%d\n", ret); printf("子线程的返回值为:%s\n", (const char*)retval); printf("\n"); } int main(int argc, char const *argv[]) { printf("主线程(%lu)开始运行...\n", pthread_self()); TEST_Join(0); // 调用函数时,子线程尚未结束 sleep(5); TEST_Join(5); // 调用函数是,子线程已终结 printf("主线程(%lu)即将退出...\n", pthread_self()); exit(EXIT_SUCCESS); }
-
输出
主线程(140402546759488)开始运行…
子线程(140402546755328)开始运行…
函数返回值 :16
子线程的返回值为:(null)子线程(140402546755328)即将退出…
子线程(140402538362624)开始运行…
子线程(140402538362624)即将退出…
函数返回值 :0
子线程的返回值为:9999主线程(140402546759488)即将退出…
4 案例:链接态线程使用之pthread_timedjoin_np
-
源码
#include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <pthread.h> #include <time.h> void *start_routine(void *ptr) { printf("子线程(%lu)开始运行...\n", pthread_self()); sleep(3); printf("子线程(%lu)即将退出...\n", pthread_self()); return (void*)"9999"; } void TEST_Join(int timeout) { pthread_t thread_id; pthread_create(&thread_id, NULL, start_routine, NULL); struct timespec ts; ts.tv_sec = 5; ts.tv_nsec = 0; void *retval = NULL; time_t start, end; time(&start); int ret = pthread_timedjoin_np(thread_id, &retval, &ts); time(&end); printf("函数耗时 :%lf\n", difftime(end, start)); // ETIMEDOUT = 110;等待在线程结束前终止 // EINVAL = 22 printf("函数返回值 :%d\n", ret); printf("子线程的返回值为:%s\n", (const char*)retval); } int main(int argc, char const *argv[]) { printf("主线程(%lu)开始运行...\n", pthread_self()); TEST_Join(1); // 调用函数时,子线程尚未结束 sleep(5); TEST_Join(5); // 调用函数是,子线程已终结 printf("主线程(%lu)即将退出...\n", pthread_self()); exit(EXIT_SUCCESS); }
-
输出
未测试出效果
5 分离态线程
int pthread_detach(pthread_t thread);
- 分离态线程,在线程结束时自动释放资源
- 分离态线程,无法获得其返回值
6 案例:分离态线程使用
-
源码
#include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <pthread.h> void *start_routine(void *ptr) { printf("子线程(%lu)开始运行...\n", pthread_self()); sleep(3); printf("子线程(%lu)即将退出...\n", pthread_self()); return (void*)"9999"; } int main(int argc, char const *argv[]) { printf("主线程(%lu)开始运行...\n", pthread_self()); pthread_t thread_id; pthread_create(&thread_id, NULL, start_routine, NULL); pthread_detach(thread_id); sleep(5); printf("主线程(%lu)即将退出...\n", pthread_self()); exit(EXIT_SUCCESS); }
-
输出
主线程(140334013024064)开始运行…
子线程(140334013019904)开始运行…
子线程(140334013019904)即将退出…
主线程(140334013024064)即将退出…