多线程数据竞争问题

摘要在Redis的Bio代码中, 需要使用for循环创建两个服务线程, 并且把两个整数0 1作为参数传到线程执行的函数中. 这个问题涉及到在linux c中, 用for循环创建多个线程并传参数时会遇到的数据竞争问题. 本文给出该问题的分析, 几段相关的错误代码的分析, 并结合redis的BIO模块代码给出总结. 第一种错误的写法我们的目标是在一个for循环里面,调用pthread_create函数创
摘要由CSDN通过智能技术生成

摘要

在Redis的Bio代码中, 需要使用for循环创建两个服务线程, 并且把两个整数0 1作为参数传到线程执行的函数中. 这个问题涉及到在linux c中, 用for循环创建多个线程并传参数时会遇到的数据竞争问题. 本文给出该问题的分析, 几段相关的错误代码的分析, 并结合redis的BIO模块代码给出总结.

第一种错误的写法

我们的目标是在一个for循环里面,调用pthread_create函数创建线程,并且把循环用到的整数i作为参数传递,希望用这个i作为线程的标志, 首先来看一段经典的错误代码:

#include <stdio.h>
#include <pthread.h>
#define THREAD_NUM 16

void *thread_func(void *arg) {
    int v = *(int*)arg;
    printf("v = %d\n", v);
    return (void*)0;
}

int main(int argc, const char *argv[]) {
    pthread_t pids[THREAD_NUM];
    int i;
    for (i = 0; i < THREAD_NUM; i++) {
        pthread_create(&pids[i], NULL, thread_func, (void*)(&i));
    }
    for (i = 0; i < THREAD_NUM; i++) {
        pthread_join(pids[i], NULL);
    }
    return 0;
}

我们这段代码能创建16个线程,然后分别传i的地址作为参数,希望能够打印出0-15这16个数字。但是通过运行我们发现,打印出来的数字有重复的,其中一次的运行结果如下:

v = 1
v = 6
v = 3
v = 4
  • 3
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值