多线程编程是现代操作系统中的重要技术,Linux系统通过POSIX线程库(pthread)提供了丰富的线程控制接口。本文将详细讲解线程控制的核心操作:线程创建、线程等待、线程终止,帮助初学者掌握这些基础但关键的线程控制方法。
在Linux中,使用pthread_create函数创建新线程。函数原型如下:
int pthread_create(pthread_t thread, const pthread_attr_t attr, void (start_routine) (void ), void arg); 参数说明:
下面是一个简单的线程创建示例,创建一个线程打印信息:
#include #include #include void thread_func(void arg) { printf("子线程正在运行,参数为:%s", (char*)arg); return NULL;}int main() { pthread_t tid; char *msg = "Hello, thread!"; int ret = pthread_create(&tid, NULL, thread_func, msg); if (ret != 0) { perror("pthread_create"); exit(1); } // 注意:这里需要等待线程结束,否则主线程可能提前退出 pthread_join(tid, NULL); return 0;}
线程等待是指一个线程(通常是主线程)等待另一个线程终止,并回收其资源。对应的函数是pthread_join。函数原型:
int pthread_join(pthread_t thread, void retval); 参数thread指定要等待的线程ID,retval用于接收线程的返回值。如果对返回值不感兴趣,可以设为NULL。pthread_join会阻塞调用线程,直到目标线程终止。
示例:主线程等待子线程结束,并获取返回值。
#include #include #include void compute(void arg) { int *result = malloc(sizeof(int)); *result = 42; // 假设计算结果为42 return (void*)result;}int main() { pthread_t tid; void *retval; pthread_create(&tid, NULL, compute, NULL); pthread_join(tid, &retval); printf("子线程返回结果:%d", (int)retval); free(retval); // 释放动态分配的内存 return 0;} 线程终止有两种方式:主动终止和被动终止。主动终止调用pthread_exit,被动终止由其他线程调用pthread_cancel取消。
在线程内部调用pthread_exit可以终止自己,并返回一个void*指针。原型:
void pthread_exit(void retval); retval是线程的退出状态,可由pthread_join获取。注意,在线程函数中执行return相当于隐式调用pthread_exit。
一个线程可以向另一个线程发送取消请求,函数原型:
int pthread_cancel(pthread_t thread); 被取消的线程会终止,其退出状态为PTHREAD_CANCELED(一个宏)。取消操作有一定的时机和类型控制,这里不深入。
示例:创建线程,然后取消它。
#include #include #include void worker(void* arg) { while(1) { printf("子线程工作中..."); sleep(1); } return NULL;}int main() { pthread_t tid; pthread_create(&tid, NULL, worker, NULL); sleep(3); // 主线程休眠3秒 pthread_cancel(tid); // 取消子线程 pthread_join(tid, NULL); // 等待子线程结束 printf("子线程已被取消"); return 0;} 本文介绍了Linux多线程编程中的三大线程控制操作:线程创建、线程等待和线程终止。掌握这些基础接口,是进一步学习线程同步、线程池等高级主题的前提。在实际编程中,务必注意线程资源的回收,避免内存泄漏。希望这篇教程能帮助小白读者快速入门Linux多线程开发。
—— 结束 ——
本文由主机测评网于2026-02-19发表在主机测评网_免费VPS_免费云服务器_免费独立服务器,如有疑问,请联系我们。
本文链接:https://www.vpshk.cn/20260226020.html