Linux_C编程—pthread_join()的使用

以我目前的知识储备,我对线程执行的理解就是:在一个进程中创建了一个线程,此线程调用了一个函数,可以在进程中通过这个线程所调用的函数来执行一些其他工作,或者辅助进程工作。由于CPU是单核,一般的来讲只要进程一直处于main程序的运行过程时,线程所调用的函数是不会执行的,因为进程没有给线程留有执行的时间。要想使线程执行,一般的操作就是使进程休眠一段时间,通过sleep()函数可以实现,在进程休眠的这段时间内,线程的可以运行。进程的休眠通常实在创建完线程之后,还有一种方法,可以让线程在程序运行到指定的步骤来执行线程,这就是pthread_join()函数。
创建好一个线程后,在进程中调用pthread_join()可以使进程等待线程执行完毕,这个函数是一个线程阻塞函数,调用它的进程将一直等待到线程执行完毕为止,而且当函数返回时,线程的资源将被收回。
如果一个线程运行结束但没有被join,则此线程的状态就像进程中的Zombie Process,所以一般最好使用pthread_join()来等待线程运行结束,并且可以得到线程的返回值并释放线程资源。
函数原型:

#include <pthread.h>

int pthread_join( pthread_t thread, void **value_ptr );
  • thread:进程要等待的线程的id,线程的id可以在创建线程的时候获取
  • value_ptr:一个用户定义的指针,用来存储线程的返回值,通常会定义一个指针,通过指针的地址来存储线程的返回值。比如:
void *p;
error = pthread_join( tid, &p );
  • 返回值:若阻塞成功则返回0;不成功返回出错的编号,通常把接收返回值的变量命名为error,这样其含义就更容易理解,可以通过如下代码来判断阻塞的成功与否:
if( error )
{
	printf("thread join failed!\n");
}
  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
pthread_cancel和pthread_joinLinux线程编程中常用的两个函数,用于线程的终止和等待线程的结束。 pthread_cancel函数用于取消指定线程的执行,其原型为: ```c int pthread_cancel(pthread_t thread); ``` 该函数会向指定线程发送取消请求,但并不会立即终止线程的执行。被取消的线程需要在适当的时候检查取消请求,并在合适的地方调用pthread_exit函数来终止自己的执行。 pthread_join函数用于等待指定线程的结束,其原型为: ```c int pthread_join(pthread_t thread, void **retval); ``` 该函数会阻塞调用线程,直到指定的线程结束。如果指定线程已经结束,那么该函数会立即返回。通过retval参数可以获取被等待线程的返回值。 搭配使用时,通常的流程是先创建线程,然后在需要的时候调用pthread_cancel函数取消线程的执行,最后使用pthread_join函数等待线程的结束。 以下是一个示例代码: ```c #include <pthread.h> #include <stdio.h> #include <unistd.h> void* thread_func(void* arg) { printf("Thread started\n"); sleep(5); printf("Thread finished\n"); pthread_exit(NULL); } int main() { pthread_t thread; pthread_create(&thread, NULL, thread_func, NULL); sleep(2); pthread_cancel(thread); void* retval; pthread_join(thread, &retval); printf("Thread joined\n"); return 0; } ``` 在上述示例中,主线程创建了一个新线程,并在2秒后调用pthread_cancel函数取消该线程的执行。然后使用pthread_join函数等待线程的结束,并打印出"Thread joined"。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值