一個簡單的線程竟態實例

寫這個東西完全是初級的東西,給不理解的人看的,理解了請pass...

1.源代碼:

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


int critical_var =0;

pthread_mutex_t mutex_c= PTHREAD_MUTEX_INITIALIZER;

void* printf_fn(void *data)
{

        int critical_var_bak=pthread_self();
        while(1){
//pthread_mutex_lock(&mutex_c);
                critical_var = critical_var_bak;
                sleep(1);
                if(critical_var != critical_var_bak){
                        printf("found ...\n");
                        printf("tid:%d critical:%d\n",critical_var_bak,critical_var);
                }
//pthread_mutex_unlock(&mutex_c);
        }

return (void*)NULL;

}


int main()
{

        pthread_t tid1,tid2;
        pthread_create(&tid1,NULL,printf_fn,NULL);
        pthread_create(&tid2,NULL,printf_fn,NULL);


        pthread_join(tid1,NULL);
        pthread_join(tid2,NULL);

        return 0;

}

2.編譯運行

gcc pthread_test.c -o pthread_test -g -lpthread

打?。?br> found ...
tid:-1328888064 critical:-1337280768
found ...
tid:-1337280768 critical:-1328888064
found ...
tid:-1328888064 critical:-1337280768
found ...
tid:-1337280768 critical:-1328888064
found ...
tid:-1328888064 critical:-1337280768
found ...
tid:-1337280768 critical:-1328888064

很明顯的可以看出來 critial的變量在線程切換的時候改變了狀態。

  1. 如果打開互斥鎖(//pthread_mutex_lock(&mutex_c);),就完全可以避免了此類問題。改一下 printf_fn
void* printf_fn(void *data)
{

        int critical_var_bak=pthread_self();
        while(1){
pthread_mutex_lock(&mutex_c);
                critical_var = critical_var_bak;
                sleep(1);
                if(critical_var != critical_var_bak){
                        printf("found ...\n");
                        printf("tid:%d critical:%d\n",critical_var_bak,critical_var);
                }
pthread_mutex_unlock(&mutex_c);
        }

return (void*)NULL;

}

4.重新編譯運行

5.結果沒有critical的打印了。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容