0、pthread_join()函数作用:
pthread_join() 函数会一直阻塞调用它的线程,直至目标线程执行结束(接收到目标线程的返回值),阻塞状态才会解除。如果 pthread_join() 函数成功等到了目标线程执行结束(成功获取到目标线程的返回值),返回值为数字 0
int pthread_join(pthread_t thread, void ** retval);
thread 参数用于指定接收哪个线程的返回值;retval 参数表示接收到的返回值,如果 thread 线程没有返回值,又或者我们不需要接收 thread 线程的返回值,可以将 retval 参数置为 NULL。
1、pthread_cond_wait() 用于阻塞当前线程,等待别的线程使用 pthread_cond_signal() 或pthread_cond_broadcast来唤醒它 。 pthread_cond_wait() 必须与pthread_mutex 配套使用。
pthread_cond_signal 函数的作用是发送一个信号给另外一个正在处于阻塞等待状态的线程,使其脱离阻塞状态,继续执行.如果没有线程处在阻塞等待状态,pthread_cond_signal也会成功返回。
2、 pthread_cond_wait必须放在pthread_mutex_lock和pthread_mutex_unlock之间,因为他要根据共享变量的状态来决定是否要等待,而为了不永远等待下去所以必须要在lock/unlock队中。
3、pthread_cond_signal既可以放在pthread_mutex_lock和pthread_mutex_unlock之间,也可以放在pthread_mutex_lock和pthread_mutex_unlock之后,但是各有各缺点。
所以,在Linux下最好pthread_cond_signal放中间,但从编程规则上说,其他两种都可以。
4、例子:
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
pthread_cond_t cond; // 定义条件变量
pthread_mutex_t mutex; // 定义互斥量
int condition = 0; // 条件
void *thread_func1(void *arg){
// 获取互斥锁
pthread_mutex_lock(&mutex);
printf("Thread 1: before wait\n");
// 等待条件变量
while(!condition){
// 条件不满足时挂起线程1
pthread_cond_wait(&cond, &mutex);
}
printf("Thread 1: after wait\n");
// 释放互斥锁
pthread_mutex_unlock(&mutex);
pthread_exit(NULL);
}
void *thread_func2(void *arg){
// 获取互斥锁
pthread_mutex_lock(&mutex);
printf("Thread 2: before signal\n");
// 设置条件
condition = 1;
// 唤醒一个被挂起的线程
pthread_cond_signal(&cond);
printf("Thread 2: after signal\n");
// 释放互斥锁
pthread_mutex_unlock(&mutex);
pthread_exit(NULL);
}
int main(){
// 初始化互斥量
pthread_mutex_init(&mutex, NULL);
// 初始化条件变量
pthread_cond_init(&cond, NULL);
pthread_t thread1, thread2;
// 创建线程1
pthread_create(&thread1, NULL, thread_func1, NULL);
// 创建线程2
pthread_create(&thread2, NULL, thread_func2, NULL);
// 等待线程1结束
pthread_join(thread1, NULL);
// 等待线程2结束
pthread_join(thread2, NULL);
// 销毁互斥量
pthread_mutex_destroy(&mutex);
// 销毁条件变量
pthread_cond_destroy(&cond);
return 0;
}
/**
* 运行结果:
* Thread 1: before wait
* Thread 2: before signal
* Thread 2: after signal
* Thread 1: after wait
*
* 程序先创建了两个线程,分别为thread1和thread2,
* 其中thread1调用了pthread_cond_wait函数挂起了自己,
* 当thread2调用pthread_cond_signal函数唤醒thread1时,
* thread1才继续执行。
* 该程序中使用了pthread_mutex_lock和pthread_mutex_unlock
* 来保护条件变量的修改,
* 确保了线程安全。
*/