2017-04-04 78 views
0

當我complie這個代碼,我可以得到這樣 enter image description here關於種族condtiion

代碼的結果是這樣的

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

void *thread_entry(void *ptr) 
     { 
int i, j, len; 
char *str = (char *) ptr; 

len = strlen(str); 
for (i = 0; i < 10; i++) 
{ 
for (j = 0; j < len; j++) { 
    putchar(str[j]); 
    sched_yield(); /*to yield CPU*/ 
          } 
    putchar('\n'); 
} 
     } 

int main() 
{ 
pthread_t thread1, thread2; 
const char *msg1 = "Hello This is Thread 1."; 
const char *msg2 = "I am Thread 2."; 

pthread_create(&thread1, NULL, thread_entry, (void *) msg1); 
pthread_create(&thread2, NULL, thread_entry, (void *) msg2); 

pthread_join(thread1, NULL); 
pthread_join(thread2, NULL); 

return 0; 
} 

也就是說代碼。我認爲是因爲Common Resource,但我不確定。請教我爲什麼結果是這樣的。我真的很欣賞它!

+1

你說過了。這裏有種族情況。你應該在臨界區使用'pthread_mutex_lock()'和'pthread_mutex_unlock()'。 –

+0

@John是否謝謝你這麼說! –

+0

此代碼是專門設計用於強調多個線程使用輸出流。這顯然是一項學術活動。請向您的教授/導師瞭解其他方向。 – ThingyWotsit

回答

0

絕對如你所想。 輸出是一個共享資源,兩個線程同時嘗試將字符推送給它。 事實上,你已經投入了一個收益,這將鼓勵(但不控制)翻轉和退出線程。

你沒有做任何事情來控制兩個線程的交錯,你不可避免地得到了屏幕截圖中顯示的亂碼輸出。

不知道你在做什麼,沒有什麼可說的。

+0

謝謝,我真的很感激它....但我不知道如何制定? –

+0

你需要一個pthreads教程。這是一個更廣泛的主題,有一些基礎原則,你不會輕易通過在Stackoverflow上提出問題獲得。我不知道一個關於pthreads的好教程。 最簡單的變化是(正如John所建議的那樣)鎖定和解鎖共享互斥鎖,以確保每個字符串都完整輸出。意志(可能)會導致像ABABABBAAABBABABAB這樣的輸出,其中兩個線程大多是觸發器,但偶爾在返回之前有兩個或更多個運行。 一個更有趣的練習是確保您得到ABABABA輸出嚴格的交替。 – Persixty