Ways to Find a Race Condition

后端 未结 8 1421
无人共我
无人共我 2021-02-05 07:02

I have a bit of code with a race condition in it... I know that it is a race condition because it does not happen consistently, and it seems to happen more often on dual core ma

8条回答
  •  难免孤独
    2021-02-05 07:51

    There is a tool included in CLang and gcc 4.8+ called ThreadSanitizer.

    You compile your code using the -fsanitize=thread flag

    Example:

    $ cat simple_race.cc
    #include 
    #include 
    
    int Global;
    
    void *Thread1(void *x) {
      Global++;
      return NULL;
    }
    
    void *Thread2(void *x) {
      Global--;
      return NULL;
    }
    
    int main() {
      pthread_t t[2];
      pthread_create(&t[0], NULL, Thread1, NULL);
      pthread_create(&t[1], NULL, Thread2, NULL);
      pthread_join(t[0], NULL);
      pthread_join(t[1], NULL);
    }
    

    And the output

    $ clang++ simple_race.cc -fsanitize=thread -fPIE -pie -g
    $ ./a.out 
    ==================
    WARNING: ThreadSanitizer: data race (pid=26327)
      Write of size 4 at 0x7f89554701d0 by thread T1:
        #0 Thread1(void*) simple_race.cc:8 (exe+0x000000006e66)
    
      Previous write of size 4 at 0x7f89554701d0 by thread T2:
        #0 Thread2(void*) simple_race.cc:13 (exe+0x000000006ed6)
    
      Thread T1 (tid=26328, running) created at:
        #0 pthread_create tsan_interceptors.cc:683 (exe+0x00000001108b)
        #1 main simple_race.cc:19 (exe+0x000000006f39)
    
      Thread T2 (tid=26329, running) created at:
        #0 pthread_create tsan_interceptors.cc:683 (exe+0x00000001108b)
        #1 main simple_race.cc:20 (exe+0x000000006f63)
    ==================
    ThreadSanitizer: reported 1 warnings
    

提交回复
热议问题