[問題] reader and writer problem [已解決]

看板C_and_CPP作者 (夢遊者)時間7年前 (2018/06/13 22:11), 7年前編輯推噓3(3024)
留言27則, 8人參與, 7年前最新討論串1/1
開發平台(Platform): (Ex: Win10, Linux, ...) Win8.1 編譯器(Ex: GCC, clang, VC++...)+目標環境(跟開發平台不同的話需列出) Code::Block 17.12 問題(Question): 1.reader和writer的sleep時間無法隨機產生每次都一樣。 2.writer每次進入更改的資料值都一樣。 餵入的資料(Input): writer數量3 reader數量4 預期的正確結果(Expected Output): 1.原本預想是reader的sleeptime隨機1~5秒,writer的sleeptime隨機1~3秒。 2.本是預想writer每次進去可以將data更改成0~50間隨意的一個數字。 錯誤結果(Wrong Output): https://imgur.com/QOBHlv0
程式碼(Code):(請善用置底文網頁, 記得排版,禁止使用圖檔) https://ideone.com/TrMRtr 補充說明(Supplement): 1.本來有想過是不是rand()函數的問題,但是後來測試了一下應該不是。 麻煩大家指點一下,弄了很久還是跑不出預期結果,感謝大家。 -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 140.115.202.112 ※ 文章網址: https://www.ptt.cc/bbs/C_and_CPP/M.1528899090.A.ED7.html ※ 編輯: penpenk (140.115.202.112), 06/13/2018 22:13:10

06/13 22:17, 7年前 , 1F
那個亂數種子?
06/13 22:17, 1F

06/13 22:44, 7年前 , 2F
我都把系統時間拿來當亂數用
06/13 22:44, 2F

06/14 01:56, 7年前 , 3F
thread會各自持有自己的種子 然後你完全沒有下srand
06/14 01:56, 3F

06/14 02:00, 7年前 , 4F
所以你的thread會生成一模一樣的亂數表 然後從頭開始跑
06/14 02:00, 4F

06/14 02:01, 7年前 , 5F
查三次 所以你writer寫出去的東西會一模一樣
06/14 02:01, 5F

06/14 02:07, 7年前 , 6F
應該reader跟writer函式開頭加個srand 種子代pid就好了
06/14 02:07, 6F

06/14 03:08, 7年前 , 7F
記得種子要攙 pid,千萬別學二樓 (ROFL)
06/14 03:08, 7F

06/14 03:10, 7年前 , 8F
請問種子代pid是什麼意思?
06/14 03:10, 8F

06/14 03:20, 7年前 , 9F
srand() 每個 thread 要給不同的亂數種子
06/14 03:20, 9F

06/14 03:21, 7年前 , 10F
有什麼數字是每個 thread 都不一樣的?
06/14 03:21, 10F

06/14 10:24, 7年前 , 11F
呃,我不太確定原PO你的問題 你是不懂什麼是亂數種子
06/14 10:24, 11F

06/14 10:27, 7年前 , 12F
不懂什麼是pid 還是不懂為什麼該用pid當種子?
06/14 10:27, 12F

06/14 13:06, 7年前 , 13F
樓上請先說清楚什麼是pid吧. 各thread的pid...?
06/14 13:06, 13F

06/14 14:47, 7年前 , 14F
啊 y大一提醒我才想起來 pid好像只有linux不同orz
06/14 14:47, 14F

06/14 14:53, 7年前 , 15F
應該說用tid才對 抱歉我誤導版友m(_ _)m
06/14 14:53, 15F

06/14 17:38, 7年前 , 16F
pid都一樣,所以目前是使用tid當種子
06/14 17:38, 16F

06/14 17:39, 7年前 , 17F
但是如果是同個thread再跑一次也會跟上一次的亂數一樣
06/14 17:39, 17F

06/14 17:41, 7年前 , 18F
例如writer1第一次改37,睡2秒,下一次writer1再進去還是
06/14 17:41, 18F

06/14 17:42, 7年前 , 19F
改37,睡2秒,請問這有辦法避免嗎?
06/14 17:42, 19F

06/14 17:46, 7年前 , 20F
把二樓講的time(null)混進去你的種子裡
06/14 17:46, 20F

06/14 17:49, 7年前 , 21F
請問是直接srand(pthread_self()+time(NULL))這樣子嗎?
06/14 17:49, 21F

06/14 17:52, 7年前 , 22F
是的 實際上不一定要用加的 只要能讓他亂就好了
06/14 17:52, 22F

06/14 18:15, 7年前 , 23F
可以用boost函式庫的話,它的uuid工具應該合你用
06/14 18:15, 23F

06/14 19:48, 7年前 , 24F
time:s ftime:ms gettimeofday:us clock_gettime:ns 2F用哪種
06/14 19:48, 24F

06/14 21:10, 7年前 , 25F
立德看到會欣慰的
06/14 21:10, 25F

06/14 21:15, 7年前 , 26F
沒錯就是立德XD,弄到現在還在弄,亂數問題解決了,但是
06/14 21:15, 26F

06/14 21:16, 7年前 , 27F
還有一些其他問題,打算寫多少明天就交多少了
06/14 21:16, 27F
※ 編輯: penpenk (140.115.202.112), 06/15/2018 16:24:45
文章代碼(AID): #1R8IOIxN (C_and_CPP)