多线程程序中printOdd线程为何能率先执行并打印数字1?
线程同步疑问解答
问题描述
这段程序能正常运行,但存在疑问:初始阶段printEven与printOdd线程均在等待条件变量的信号(执行pthread_cond_wait(&cond, &mutex);语句),此时printEven无法发送信号,printOdd是如何继续执行的?简单来说,数字1是如何被打印出来的?
#include <stdio.h> #include <unistd.h> #include <pthread.h> pthread_t tid[2]; pthread_mutex_t mutex; pthread_cond_t cond; int count = 1; // Shared variable to keep track of the current number to be printed void* printEven(void* arg) { while (count <= 10) { pthread_mutex_lock(&mutex); while (count % 2 != 0) { printf("waiting for cv signal\n"); pthread_cond_wait(&cond, &mutex); } printf("Even: %d\n", count++); pthread_cond_signal(&cond); pthread_mutex_unlock(&mutex); } pthread_exit(NULL); } void* printOdd(void* arg) { while (count <= 10) { pthread_mutex_lock(&mutex); while (count % 2 != 1) { pthread_cond_wait(&cond, &mutex); } printf("Odd: %d\n", count++); pthread_cond_signal(&cond); pthread_mutex_unlock(&mutex); } pthread_exit(NULL); } int main() { pthread_mutex_init(&mutex, NULL); pthread_cond_init(&cond, NULL); pthread_create(&tid[1], NULL, printOdd, NULL); sleep(10); printf("creating even thread\n "); pthread_create(&tid[0], NULL, printEven, NULL); pthread_join(tid[0], NULL); pthread_join(tid[1], NULL); pthread_mutex_destroy(&mutex); pthread_cond_destroy(&cond); return 0; }
核心原因
你误解了初始阶段两个线程的状态——printOdd线程一开始根本不会进入等待状态,具体流程如下:
- 主线程先创建
printOdd线程,此时count初始值为1,满足count % 2 == 1的条件。 printOdd线程获取到互斥锁后,直接跳过while等待循环,打印Odd: 1,然后将count自增为2,接着发送条件变量信号,最后释放互斥锁。- 这时候主线程还在
sleep(10),printEven线程尚未创建。等10秒后printEven线程创建,此时count已经是2,printEven线程获取锁后满足count%2==0的条件,开始打印偶数,之后两个线程通过条件变量的信号交替唤醒对方,完成后续打印。
简单说:初始时count是奇数,printOdd线程的等待条件不成立,所以直接执行打印逻辑,不需要等待信号,这就是数字1能被打印的原因。
内容的提问来源于stack exchange,提问作者sagul kumar
相关产品推荐
相关产品推荐

