#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)



















