C 语言局部 static 变量多线程 DataRace 验证

验证局部静态变量 static int cnt 在无锁情况下的 data race:

测试 C 源码:

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

void* foo(void* args)
{
    static int cnt = 0;
    printf("%d\n", ++cnt);
}

int main(int argc, char** argv)
{
    if (argc < 2)
        return -1;
    int THREADS_NUM = atoi(argv[1]);

    pthread_t tid[THREADS_NUM];
    for (int i = 0; i < THREADS_NUM; ++i) {
        pthread_create(&tid[i], NULL, foo, NULL);
    }
    for (int i = 0; i < THREADS_NUM; ++i) {
        pthread_join(tid[i], NULL);
    }
}

编译、运行、验证

gcc main.c -lpthread && ./a.out 10000 | sort -n | uniq -dc
  • sort -n 按照数字顺序排序,如果降序则 sort -r
  • uniq -dc 打印重复的行及重复次数

在我的测试环境下,线程数小于 1000 很难发生 data race;线程数设置到 10000 左右即可观察到

posted @ 2023-01-15 21:51  Zijian/TENG  阅读(242)  评论(0)    收藏  举报