[問題] 使用C++11/14並行 function的選擇請益

看板C_and_CPP作者 (Clang++)時間8年前發表 (2017/02/06 14:20), 8年前編輯推噓4(4018)
留言22則, 7人參與, 最新討論串1/1
開發平台(Platform): (Ex: Win10, Linux, ...) Windows 編譯器(Ex: GCC, clang, VC++...)+目標環境(跟開發平台不同的話需列出) VC 2015 各位版友大家好,小弟我最近有個問題想要請教。 事情是這樣的。 小弟我目前在工作上遇到一個情況 用一個人家廠商提供的API int dosomething(參數不重要); 使用這個API時,如果是成功的話,他會直接卡在這個function直到連線中斷或是下中斷。 這樣會讓我在程式中,無法繼續做其他的事情。 失敗的話,會立刻回傳一個int 的error code訊息來告訴你。 這很明顯的就是要用一個thread去做處理。 於是小弟我就使用了一個std::thread接這個function 然後再做detach 但是我發現假設失敗的話無法拿到正確的error code你必須將error code寫在參數中 可是介面是寫死的無法動 所以小弟我現在的解法是這樣 用一個future auto f = async(std::launch::async, dosomething, 參數...); 然後 atuo status = f.wait_for(100ms); //代表他馬上拋出錯誤訊息 if(status != std::future_status::timeout) { return f.get(); } 以上使用async的解法是否恰當?? 是否有其他更好的做法?? 謝謝 -- 法老就預備他的車輛,帶領軍兵同去。埃及人追趕他們,法老一切的戰車就在他們安營 的地方追上了。他們對摩西說:你把我們帶來死在曠野嗎?你為甚麼這樣待我們,將我 們從埃及領出來呢?摩西向天空伸出無線電天線呼叫空中打擊,耶和華便用以色列空軍 F-16攜帶近接空中支援彈藥出擊。呼嘯而過的戰機在一小時內癱瘓了法老的戰車,連一 個也沒有賸下。以色列人看見埃及人的死屍都在海邊了。就敬畏耶和華、又信服他和他 的僕人摩西 。 《舊約聖經‧出埃及記‧14章》 -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 118.166.219.147 ※ 文章網址: https://www.ptt.cc/bbs/C_and_CPP/M.1486390827.A.ADF.html

02/07 00:21, , 1F
剛好看到 Item 36 的人路過...
02/07 00:21, 1F

02/07 00:22, , 2F
有甚麼不滿的嗎?
02/07 00:22, 2F

02/07 00:25, , 3F
不過寫死100ms這樣不就沒什麼彈性,你確定 runtime
02/07 00:25, 3F

02/07 00:28, , 4F
系統 loading 一變化或如何這段code還符合你的預期嗎
02/07 00:28, 4F

02/07 00:29, , 5F
我也是剛接觸 Concurrency API 的新手,只是剛看有這
02/07 00:29, 5F

02/07 00:29, , 6F
樣的疑問而已...
02/07 00:29, 6F

02/07 01:37, , 7F
如果失敗的話有需要做什麼處理嗎? 可以用callback
02/07 01:37, 7F

02/07 01:40, , 8F
比方說DoSomethingWrapper(原本參數...,Callback)
02/07 01:40, 8F

02/07 01:41, , 9F
實作為error = DoSomeThing(參數); callback(error);
02/07 01:41, 9F
我覺得Callback好像也行不通?? 因為Dosomething那邊如果成功就會卡在那行了 這樣Callback是否能夠運作呢??

02/07 01:50, , 10F
如果有事情是確定成功才能做的 這樣我只想得到wait
02/07 01:50, 10F

02/07 02:02, , 11F
寫一個 wrapper 在有錯誤時拋 exception 這樣可行嗎
02/07 02:02, 11F

02/07 02:04, , 12F
仔細想想好像也不用, 把 error code 存在某個地方就好
02/07 02:04, 12F

02/07 09:34, , 13F
to uranusjr大 effective modern c++ item 36好像有說
02/07 09:34, 13F

02/07 09:35, , 14F
thread 無法接到你拋的exception不過我不知道你的wrapper
02/07 09:35, 14F

02/07 09:35, , 15F
要怎樣設計就是了
02/07 09:35, 15F

02/07 09:52, , 16F
用current_exception與rethrow_exception
02/07 09:52, 16F

02/07 09:53, , 17F
就可以跨thread傳exception
02/07 09:53, 17F
這個方案我擔心會不會問題也出在成功時直接卡在DoSomething那邊 所以基本上所有的問題應該都是出在廠商本身的API上... ※ 編輯: Clangpp (59.124.167.226), 02/07/2017 11:25:55

02/07 20:34, , 18F
我原本想說callback是有錯才要處理的
02/07 20:34, 18F

02/07 20:34, , 19F
如果沒回傳錯誤沒進callback似乎也沒關係
02/07 20:34, 19F

02/07 20:35, , 20F
但關鍵就在成功的話有沒有需要執行什麼程式
02/07 20:35, 20F

02/08 14:43, , 21F
非同步func用parallel_invoke應該相對簡單
02/08 14:43, 21F

02/08 21:26, , 22F
推簽名檔
02/08 21:26, 22F
文章代碼(AID): #1Oc8OhhV (C_and_CPP)