首页 > 数字化转型 > ERP > pthread_join()
pthread_join()会挂起父线程,直至子线程完成才可以执行后面的代码,此外,一个PTHREAD_CREATE_JOINABLE状态的子线程不会自动释放该线程的内存资源,包括线程描述符和其使用的栈;而主线程调用pthread_detach()时,无需等待子线程的完成,它可以立即执行后面的代码,当然,也有可能主线程执行完之后销毁进程,导致子线程未能执行.
为了很好的说明互斥锁,我们使用一个实例来进行说明. 假设cond表示条件变量.mutex表示互斥锁.x==y表示我们要满足的测试条件.我们可以有下面的伪代码:
#include
pthread_mutex_t mutex=PTHREAD_MUTEX_INITIALIZER;
pthread_cond_t cond =PTHREAD_COND_INITIALIZER;
static int x = 1;
staitc int y = 2;
/* 下面的这个代码用来检测条件x==y是否成立. */
1) pthread_mutex_lock(&mutex);
2) while(x!=y)
3) pthread_cond_wait(&cond,&mutex);
4) .... /* 进行我们的操作 */
5) pthread_mutex_unlock(&mutex);
/* 下面的代码用来改变x,y的值,使它们去满足一定的条件 */
6) pthread_mutex_lock(&mutex);
7) x++;
8) pthread_cond_signal(&cond);
9) pthread_mutex_unlock(&mutex);
我们来分析一下上面的伪代码.
我们考虑一个线程从1)开始执行,一个从6)开始执行.如果线程一首先开始执行了1)锁住了 mutex然後执行了2)进行条件测试.由于我们的x!=y成立,然後线程执行3)线程这个时候阻塞了.按照线程条件变量的要求,线程在阻塞之前隐式的(没有调用pthread_mutex_unlock) 来释放互斥锁.这个时候线程二开始执行6).由于线程一隐式的释放了互斥锁,所以线程二获得了互斥锁.可以执行7)接着执行8).这个时候线程二唤醒线程一,同时线程二继续执行. 线程一接收到了信号,由于线程一在pthread_cond_wait中隐式的释放了互斥锁,所以这个时候线程一又隐式的去锁住互斥锁不过这个时候互斥锁还被线程二拥有,所以线程一在隐式的锁住互斥锁处阻塞.直到线程二执行完9)以後,线程一才从3返回,由于线程一不知道条件是否成立,所以线程继续执行2)测试条件.条件成立,线程一开始执条件是否成立,所以线程继续执行2)测试条件.条件成立,线程一开始执行其它操作. 由于我们隐式的锁住了互斥锁,所以最後要释放互斥锁. 从上面的分析和从pthread_cond_wait的原型我们可以"猜测"一下pthread_cond_wait所执行的操作
/* 注意实际情况肯定不是这样的,我这样写只是我们更容易离解一些 */
...
/* 从pthread_cond_wait中隐式的释放互斥锁 */
1) pthread_mutex_unlock(&mutex);
... /* 阻塞 */
/* 从pthread_cond_wait中隐式的锁住互斥锁 */
2) pthread_mutex_lock(&mutex);
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/23168012/viewspace-1045836/ ,如需转载,请注明出处,否则将追究法律责任。