作者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/cn.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