看板 C_and_CPP 關於我們 聯絡資訊
大家好, 我在 BCB6.0 上原本是想測試執行緒執行效能如何, 但發現這奇怪的現象 CODE: http://ideone.com/HJiA0e 使用多執行緒時, 每次呼叫的亂數總和值 sum 都是 4694505.719100 這是為什麼呢? 在我理解上 rand() 函式很像查亂數表, 整個程式不論 rand() 寫在哪裡, 只要同樣是第 N 次去呼叫 rand(),就會得到相同結果。 if R1 = rand(N), R2 = rand(N) then R1 = R2 所以說執行緒是大家同時去呼叫 rand() ? 可是在程式碼第 29 行 call++ 每個 call 值又不一樣。 另外請教大家, 如果是單核心電腦,使用這樣的程式是不是就沒有 加快執行速度的功能了? 謝謝 -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 110.26.134.74 ※ 文章網址: https://www.ptt.cc/bbs/C_and_CPP/M.1447071728.A.241.html
LPH66: rand 不是 thread-safe 的 11/09 20:25
x000032001: 要call srand()阿 11/09 20:26
LPH66: 啊, 我記錯了, 它是不是 thread-safe 由實作決定 11/09 20:27
LPH66: 也就是各線一起呼叫互相有沒有可能有奇怪的影響是不一定的 11/09 20:28
LPH66: 單核心跑多線程就一樣是要 context switch 11/09 20:31
littleshan: 不奇怪,因為rand()裡面有一個global state亦即seed 11/09 20:31
LPH66: 只不過它比 process 的 context switch 輕鬆一點 11/09 20:31
littleshan: 實作上如果為了要thread safe又要速度快 11/09 20:31
littleshan: 會把seed存在thread local storage 11/09 20:31
littleshan: 這麼一來每支thread會有相同的seed,又執行同次數rand 11/09 20:32
noodleT: 那為什麼主執行緒自己第一次呼叫(43行)的結果和多執行緒 11/09 23:02
noodleT: 不同? 11/09 23:02
bibo9901: 這叫 race-condition,多人同時"寫"就會這樣 11/10 00:56
grayStone: C的rand是用LCG算出來的 seed一樣同時算就會有一樣的結 11/10 06:07
grayStone: 果 11/10 06:07
LPH66: race condition 就是我所講的"奇怪的影響"之一 11/10 08:29
LPH66: 也就是說不只有誰先取誰後取, 還有誰取到一半被打斷的狀況 11/10 08:30