當使用多個執行緒呼叫負責產生不同隨機數的通用函數時,考慮以下因素至關重要:初始化隨機數產生器的方法。函數 srand(time(0)) 負責初始化生成器。然而,它在程式碼中的放置會影響結果的一致性。
問題是是否應該在每個函數執行開始時為整個程式呼叫一次 srand(time(0)) ,或者是否有替代策略。
答案在於與 rand() 相關的線程安全問題。文件明確指出 rand() 不是執行緒安全的,這意味著它會在每次呼叫時修改隱藏狀態。為了確保跨線程的行為一致,必須明確處理狀態。
替代函數 rand_r() 接受指向無符號整數的指標作為狀態,提供最少量的狀態資訊。此函數將產生較弱的偽隨機產生器。作為增強選項,建議使用 drand48_r(3)。
因此,為了跨多個執行緒維持可預測的隨機數生成,有必要使用執行緒安全函數,如 rand_r() 或 drand48_r(3),而不是蘭特()。
以上是如何確保 C 中線程安全的隨機數產生?的詳細內容。更多資訊請關注PHP中文網其他相關文章!