看板 C_and_CPP 關於我們 聯絡資訊
( *[1m *[m 為色碼,可以按 Ctrl+V 預覽會顯示的顏色 ) ( 未必需要依照此格式,文章條理清楚即可 ) 遇到的問題: (題意請描述清楚) 在Linux底下希望能寫個有 race condition 的範例程式 但是程式怎麼跑都是正確的結果 想請問為什麼跑不出 race condition 的情形 開發平台: Ubuntu 9.04 desktop 有問題的code: #include <stdio.h> #include <pthread.h> #define NTHREADS 100 void *thread_function(void *); int counter = 0; int main() { pthread_t thread_id[NTHREADS]; int i, j; for (i = 0; i < NTHREADS; i++) { pthread_create(&thread_id[i], NULL, thread_function, NULL); } for (j = 0; j < NTHREADS; j++) { pthread_join(thread_id[j], NULL); } /* Now that all threads are complete I can print the final result. */ /* Without the join I could be printing a value before all the threads */ /* have been completed. */ printf("Final counter value: %d\n", counter); } void *thread_function(void *dummyPtr) { printf("Thread number %ld\n", pthread_self()); counter++; } 補充說明: -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 122.120.38.78
learnerQQ:不好意思想閒聊一個東西...UBUNTU 9.10出嚕嗎?@"@ 10/28 18:48
james732:你跑出怎樣的結果?你覺得應該會跑出怎樣的結果?為什麼? 10/28 18:55
jlovet:如果只是希望他沒有交錯出現的話,那應該不叫race... 10/28 20:32
lgen7604:應該是希望看到counter的值小於100 10/28 21:21
ledia:試試 int t = counter; 印過 thread id 之後再 counter=t+1; 10/28 22:27
ledia:為什麼單用 counter++; 不行... 我也不知道 囧 10/28 22:28
lgen7604:試過加t 還是不行啊 QQ 10/29 00:17
walker2009:因為cpu太快 10/29 00:53
walker2009:記得在某個地方加上 sleep(1) 之類的好像就可以錯開 10/29 00:54
phterry:counter++的地方,用迥圈做100次,然後看最後印出的值, 10/29 11:07
phterry:如果,最後的值不是10000,那就是race condition 10/29 11:08
lgen7604:試過用迴圈跑1000次counter++ 還是沒有race condition 10/29 12:09