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

如何创建两个共享同一全局变量的pthread线程,分别执行不同操作?

你当前代码存在两个核心问题:

  1. 两个线程绑定了完全相同的处理函数,没有区分任务的逻辑,无法实现一个加2、一个乘2的需求
  2. 共享全局变量没有做并发访问保护,多线程同时读写会触发竞态条件,导致输出结果不符合预期

解决方案

可以通过pthread_create的第四个参数给线程传递任务标识区分执行逻辑,同时新增互斥锁保证共享变量的并发访问安全,修改后的完整代码如下:

#include <stdio.h>
#include <pthread.h>
#include <stdlib.h>
#include <unistd.h>

int var = 0; 
pthread_t threads[2];
// 新增互斥锁,保护共享变量var的读写操作
pthread_mutex_t var_mutex = PTHREAD_MUTEX_INITIALIZER;

void* function(void* arg){
    // 接收传入的任务标识:1代表加2,2代表乘2
    int task_type = *(int*)arg;
    // 操作共享变量前加锁
    pthread_mutex_lock(&var_mutex);
    if(task_type == 1){
        var += 2;
        printf("执行加2任务,变量地址%p,当前var值:%d\n", &var, var);
    }else if(task_type == 2){
        var *= 2;
        printf("执行乘2任务,变量地址%p,当前var值:%d\n", &var, var);
    }
    // 操作完成后解锁
    pthread_mutex_unlock(&var_mutex);
    return NULL;
}

int main() {
    // 定义两个不同的任务标识
    int task_add = 1, task_mul = 2;
    // 创建线程时分别传入不同的任务参数
    pthread_create(&threads[0], NULL, function, &task_add);
    pthread_create(&threads[1], NULL, function, &task_mul);
    // 等待两个线程执行完成再退出
    pthread_join(threads[0], NULL);
    pthread_join(threads[1], NULL);
    // 销毁互斥锁释放资源
    pthread_mutex_destroy(&var_mutex);
    return 0;
}

补充说明

  • 线程参数支持传递任意类型的指针,除了简单的任务标识,你也可以根据需求传入结构体承载更复杂的任务参数
  • 原代码中用%d打印指针地址是不规范的,64位系统下地址长度超过int范围会被截断,建议用%p格式化输出指针
  • 如果需要固定两个线程的执行顺序(比如先加2再乘2),可以新增条件变量做同步控制

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 08:06:03