#include <pthread.h>
#include <stdio.h>
#include <unistd.h>
pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
pthread_cond_t cond = PTHREAD_COND_INITIALIZER;
void* thread_function(void* arg) {
printf("线程等待唤醒,锁定互斥量...\n");
pthread_mutex_lock(&mutex);
printf("线程等待在条件变量上...,这个时候会阻塞这里,且释放锁\n");
pthread_cond_wait(&cond, &mutex);
// 线程被唤醒后继续执行
printf("线程被唤醒!\n");
pthread_mutex_unlock(&mutex);
return NULL;
}
int main() {
pthread_t thread_id;
// 创建线程
pthread_create(&thread_id, NULL, &thread_function, NULL);
// 睡眠一段时间,以便让线程先运行并等待条件变量
sleep(5);
// 唤醒等待在条件变量上的线程
printf("主线程发送唤醒信号...\n");
pthread_mutex_lock(&mutex);
printf("主线程发送唤醒信号2...\n");
pthread_cond_signal(&cond);
printf("主线程发送唤醒信号3...\n");
pthread_mutex_unlock(&mutex); //上面加锁,这里就必须配套解锁,否则即便pthread_cond_wait取不到锁还是卡在那
printf("主线程发送唤醒信号4...\n");
// 等待子线程结束
printf("等待子线程结束 1...\n");
pthread_join(thread_id, NULL);
printf("等待子线程结束 2...\n");
return 0;
}
makefile执行 :gcc optThread.c -lpthread -o opt
执行结果
fr:徐海涛(hunkxu)