You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

多线程程序中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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.03 17:40:29