推 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