首页 > 其他分享 >C 语言局部 static 变量多线程 DataRace 验证

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

时间:2023-01-15 22:01:14浏览次数:42  
标签:cnt DataRace int NUM THREADS pthread static 多线程

验证局部静态变量 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 左右即可观察到

标签:cnt,DataRace,int,NUM,THREADS,pthread,static,多线程
From: https://www.cnblogs.com/tengzijian/p/17054205.html

相关文章

  • Python爬虫-第四章-1-多线程多进程并发爬取Ⅲ-爬取某菜市场批发价数据
    #DemoDescribe:爬取北京新发菜地数据importrequestsimportcsvfromconcurrent.futuresimportThreadPoolExecutorfromfake_useragentimportUserAgent'''本章内容:......
  • (六)Java多线程
    Java多线程1、Java中的多线程1)通过JDK中的java.lang.Thread可以实现多线程。2)Java中多线程运行的程序可能是并发也可能是并行,取决于操作系统对线程的调度和计算机......
  • c#利用异步方法去模拟多线程处理业务
    一个巧妙的设计原理:利用async标识方法执行异步处理List<long>listIds=newList<long>();//业务任务:假设处理这个列表的任务objectlockObj=newobject......
  • java多线程编程技术 +代码实例
    1.      java和他的API都可以使用并发。可以指定程序包含不同的执行线程,每个线程都具有自己的方法调用堆栈和程序计数器,使得线程在与其他线程并发地执行能够共享程序......
  • java for循环改造多线程例子
    1packagecom.company;23importjava.util.ArrayList;4importjava.util.List;5importjava.util.concurrent.CountDownLatch;6importjava.util.concur......
  • 多线程案例-线程池
    1.什么是线程池线程存在的意义是当使用进程进行并发编程太重了,此时引入了一个"轻量级的"进程-线程.创建线程比创建进程更高效,销毁线程比销毁进程更高效,调度线程比调度......
  • 多线程并发爬虫教程示例
    爬虫总体上分为四个主要步骤:1、明确目标,需要做的从哪个途径或者哪个范围内网站搜索。2、爬,将获取到的网站内容全部爬下来。3、取,对数据分析去掉没用的数据。4、处理数据......
  • (狂神)多线程JUC并发
    1、什么是JUCJUC就是java.util.concurrent下面的类包,专门用于多线程的开发。java.util包下的三个工具类:java.util.concurrentjava.util.concurrent.atomicjava.util.......
  • 继承Thread类创建多线程
    之前我们学习了多线程,今天来说Java程序中如何实现多线程,Java提供了两种多线程实现方法,今天就来说说第一种继承Thread类创建多线程,另一种方法请看下篇!在学习多线程之前,先来看......
  • 线程池使用ExecutorService 多线程处理队列任务
    最近转到银行工作,在做最核心的财务账务部分,对我来说是一个比较新的东西,工作也已经四年有余,接触一些新的东西,也是不错,每天也累得像狗...不说了。/捂脸接下来说一种非常实用的......