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

如何使用semaphore同步3个独立线程完成输入选择计算任务

线程职责划分与实现方案

一、线程职责划分

  • Thread1:仅负责获取用户输入的两个整数,写入全局共享的数值变量,完成后通过信号量通知Thread2启动
  • Thread2:等待Thread1的通知后,获取用户输入的运算类型(Add/Sub),写入全局共享的运算标识变量,完成后通过信号量通知Thread3启动
  • Thread3:等待Thread2的通知后,读取共享的数值和运算标识,执行对应计算,将结果写入全局共享的结果变量,完成后通过信号量通知主线程读取结果
  • 主线程:初始化所有信号量,启动三个工作线程后等待Thread3的通知,收到通知后打印最终计算结果,最后回收资源

二、信号量同步逻辑

由于三个工作线程的执行有严格的先后依赖:必须先拿到两个运算数,才能选择运算类型,选完运算类型才能执行计算,因此设置3个初始值为0的信号量做执行顺序管控:

  • sem_num:Thread1完成数值输入后释放,Thread2通过等待该信号量确认前置操作完成
  • sem_op:Thread2完成运算类型选择后释放,Thread3通过等待该信号量确认前置操作完成
  • sem_res:Thread3完成计算后释放,主线程通过等待该信号量确认计算完成可以读取结果

三、C语言实现示例

以下是可直接运行的实现代码,编译时需要链接pthread库,编译命令为gcc demo.c -o demo -lpthread

#include <stdio.h>
#include <pthread.h>
#include <semaphore.h>

// 全局共享变量
int num1, num2, result;
char op_type; // 'A'/'a'代表加法,'S'/'s'代表减法

// 信号量定义
sem_t sem_num;  // 数值输入完成信号
sem_t sem_op;   // 运算类型选择完成信号
sem_t sem_res;  // 计算完成信号

void *thread1_task(void *arg) {
    printf("请输入第一个数字:");
    scanf("%d", &num1);
    printf("请输入第二个数字:");
    scanf("%d", &num2);
    sem_post(&sem_num); // 通知Thread2可以执行
    return NULL;
}

void *thread2_task(void *arg) {
    sem_wait(&sem_num); // 等待Thread1完成数值输入
    printf("请选择运算类型(输入A为加法,输入S为减法):");
    scanf(" %c", &op_type); // 前面加空格跳过缓冲区残留的换行符
    sem_post(&sem_op); // 通知Thread3可以执行
    return NULL;
}

void *thread3_task(void *arg) {
    sem_wait(&sem_op); // 等待Thread2完成运算类型选择
    if (op_type == 'A' || op_type == 'a') {
        result = num1 + num2;
    } else if (op_type == 'S' || op_type == 's') {
        result = num1 - num2;
    } else {
        printf("运算类型输入无效,默认按加法计算\n");
        result = num1 + num2;
    }
    sem_post(&sem_res); // 通知主线程计算完成
    return NULL;
}

int main() {
    pthread_t t1, t2, t3;
    // 初始化信号量,第二个参数为0代表信号量为线程间共享
    sem_init(&sem_num, 0, 0);
    sem_init(&sem_op, 0, 0);
    sem_init(&sem_res, 0, 0);

    // 启动三个工作线程
    pthread_create(&t1, NULL, thread1_task, NULL);
    pthread_create(&t2, NULL, thread2_task, NULL);
    pthread_create(&t3, NULL, thread3_task, NULL);

    // 等待计算完成
    sem_wait(&sem_res);
    printf("最终运算结果为:%d\n", result);

    // 回收资源
    sem_destroy(&sem_num);
    sem_destroy(&sem_op);
    sem_destroy(&sem_res);
    pthread_join(t1, NULL);
    pthread_join(t2, NULL);
    pthread_join(t3, NULL);

    return 0;
}

内容的提问来源于stack exchange,提问作者Raisa Rahman

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.23 15:06:03