如何创建两个共享同一全局变量的pthread线程,分别执行不同操作?
你当前代码存在两个核心问题:
- 两个线程绑定了完全相同的处理函数,没有区分任务的逻辑,无法实现一个加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
相关产品推荐
相关产品推荐

