作者Clangpp (Clang++)
看板C_and_CPP
標題[問題] 使用C++11/14並行 function的選擇請益
時間Mon Feb 6 22:20:21 2017
開發平台(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://webptt.com/m.aspx?n=bbs/C_and_CPP/M.1486390827.A.ADF.html
1F:推 phishingphi: 剛好看到 Item 36 的人路過... 02/07 00:21
2F:→ Caesar08: 有甚麼不滿的嗎? 02/07 00:22
3F:→ phishingphi: 不過寫死100ms這樣不就沒什麼彈性,你確定 runtime 02/07 00:25
4F:→ phishingphi: 系統 loading 一變化或如何這段code還符合你的預期嗎 02/07 00:28
5F:→ phishingphi: 我也是剛接觸 Concurrency API 的新手,只是剛看有這 02/07 00:29
6F:→ phishingphi: 樣的疑問而已... 02/07 00:29
7F:推 ilikekotomi: 如果失敗的話有需要做什麼處理嗎? 可以用callback 02/07 01:37
8F:→ ilikekotomi: 比方說DoSomethingWrapper(原本參數...,Callback) 02/07 01:40
9F:→ ilikekotomi: 實作為error = DoSomeThing(參數); callback(error); 02/07 01:41
我覺得Callback好像也行不通?? 因為Dosomething那邊如果成功就會卡在那行了
這樣Callback是否能夠運作呢??
10F:→ ilikekotomi: 如果有事情是確定成功才能做的 這樣我只想得到wait 02/07 01:50
11F:→ uranusjr: 寫一個 wrapper 在有錯誤時拋 exception 這樣可行嗎 02/07 02:02
12F:→ uranusjr: 仔細想想好像也不用, 把 error code 存在某個地方就好 02/07 02:04
13F:→ Clangpp: to uranusjr大 effective modern c++ item 36好像有說 02/07 09:34
14F:→ Clangpp: thread 無法接到你拋的exception不過我不知道你的wrapper 02/07 09:35
15F:→ Clangpp: 要怎樣設計就是了 02/07 09:35
16F:→ Caesar08: 用current_exception與rethrow_exception 02/07 09:52
17F:→ Caesar08: 就可以跨thread傳exception 02/07 09:53
這個方案我擔心會不會問題也出在成功時直接卡在DoSomething那邊
所以基本上所有的問題應該都是出在廠商本身的API上...
※ 編輯: Clangpp (59.124.167.226), 02/07/2017 11:25:55
18F:→ ilikekotomi: 我原本想說callback是有錯才要處理的 02/07 20:34
19F:→ ilikekotomi: 如果沒回傳錯誤沒進callback似乎也沒關係 02/07 20:34
20F:→ ilikekotomi: 但關鍵就在成功的話有沒有需要執行什麼程式 02/07 20:35
21F:推 TeaEEE: 非同步func用parallel_invoke應該相對簡單 02/08 14:43
22F:推 Schottky: 推簽名檔 02/08 21:26