美文网首页
线程竞态工具的使用说明

线程竞态工具的使用说明

作者: followhy | 来源:发表于2014-08-24 18:29 被阅读59次

    操作系统环境: ubuntu12.04

    step 1 安装Clang,必须是3.3以上的版本

    sudo apt-get install clang-3.3
    

    step 2 编写测试程序

    #include <pthread.h>  
    
    int global;  
        
    void * tfun1(void *x)   
    {  
        global = 1;  
        return x;  
    }  
    
    int main()  
    {
        pthread_t t;  
        pthread_create(&t, NULL, tfun1, NULL);  
        global = 2;  
        pthread_join(t, NULL);  
        return global;  
    }
    
    

    step 3 编译程序

    clang -fsanitize=thread -g -O1 test.c
    

    step 4 察看运行结果

    ./a.out
    
    ==================
    WARNING: ThreadSanitizer: data race (pid=13047)  
    Write of size 4 at 0x7fbe3dc16730 by thread T1:  
     #0 tfun1 /home/songwenbin/Play/testscanitizer/test.c:7 (exe+0x000000055260)  
    
    Previous write of size 4 at 0x7fbe3dc16730 by main thread:  
    #0 main /home/songwenbin/Play/testscanitizer/test.c:15 (exe+0x0000000552b4)  
    
    Thread T1 (tid=13049, running) created by main thread at:  
    #0 pthread_create ??:0 (exe+0x0000000266c2)  
    #1 main /home/songwenbin/Play/testscanitizer/test.c:14 (exe+0x0000000552a4)    
    SUMMARY: ThreadSanitizer: data race /home/songwenbin/Play/testscanitizer/test.c:7 > tfun1
    ==================
    

    可以看出由于main和tfun1函数都修改global全局变量,两个函数的代码都没有对global全局变量的使用做保护,所以thread-sanitizer给出了警告提示

    step 5 对共享变量加入保护代码

    #include <pthread.h>
    
    int global;
    pthread_mutex_t mutex;
        
    void * tfun1(void *x) 
    {
        pthread_mutex_lock(&mutex);
        global = 1;
        pthread_mutex_unlock(&mutex);
        return x;
    }
    
    int main()
    {
        pthread_mutex_init(&mutex, NULL);  
        pthread_t t;  
        pthread_create(&t, NULL, tfun1, NULL);  
    
        pthread_mutex_lock(&mutex);
        global = 2;
        pthread_mutex_unlock(&mutex);
     
        pthread_join(t, NULL);
        return global;
    }
    

    再编译运行此代码则不会出现警告信息

    相关文章

      网友评论

          本文标题:线程竞态工具的使用说明

          本文链接:https://www.haomeiwen.com/subject/fvadtttx.html