多线程数据竞争问题

本文探讨了在Linux C中,使用for循环创建多线程时遇到的数据竞争问题,通过错误代码实例分析了问题原因,并提出了两种解决方案:避免数据共享和利用指针空间传递整数。同时,介绍了Redis Bio模块如何处理此类问题。
摘要由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
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值