- 主题:std::future 的异步接口怎么用?
现在用一个库,对方提供的异步接口是基于 std::future的,无法理解。
以前使用基于 callback 函数的异步接口,我的调用现成调用完异步接口后,该干嘛干嘛,结果来了回调函数自动调用。
现在基于 future 的接口,返回一个 future, 我岂不是还要单独创建要给线程定时检测 future 的状态?
没有理解这个 future 的好处在哪里? 该咋用?
以前:
void callback(int send_size)
{
do_something(send_size);
}
int main()
{
connection c;
for (int i =0; i < 100; ++i)
c.asyn_send(data);
sleep(100000);
return 0;
}
在上面代码里,我只要在主线程里不停地发数据,然后在 calback 里自动得到发送的结果。
现在 如果 asyn_send 直接返回一个 future 的话,我是不是还要单独弄个线程定时去轮询?
--
FROM 218.76.62.*
基于callback的异步方式很多槽点啊,虽然写习惯了,但是我觉得最大的问题是callback传输数据的时候多少都存在多线程同步数据的问题,就算用lockfree结构或者atomic,cache coherence问题也无法避免
future方式的话,就你现在来说,可以
1. 单独拿个线程死读,然后再同步数据,这个嘛,就有点多余了
2. 在dosomething里,写个死读,读future结果
当然以后coroutine进标准库以后可以直接用cowait
这个是c++的发展方向,尽量在用户层面避免使用thread,能写单线程代码就写单线程代码。可能是因为现在cpu核多了以后,各种不一样的内存和cache构架。
【 在 speedboy2998 的大作中提到: 】
: 现在用一个库,对方提供的异步接口是基于 std::future的,无法理解。
: 以前使用基于 callback 函数的异步接口,我的调用现成调用完异步接口后,该干嘛干嘛,结果来了回调函数自动调用。
: 现在基于 future 的接口,返回一个 future, 我岂不是还要单独创建要给线程定时检测 future 的状态?
: ...................
--
FROM 115.193.160.*
所以就是把 future 都 move 到一个vector里,然后创建一个线程,在这个线程里轮询这些future 的状态,如果状态已经就绪,就callback,是这样吧?
【 在 ziqin 的大作中提到: 】
: 基于callback的异步方式很多槽点啊,虽然写习惯了,但是我觉得最大的问题是callback传输数据的时候多少都存在多线程同步数据的问题,就算用lockfree结构或者atomic,cache coherence问题也无法避免
: future方式的话,就你现在来说,可以
: 1. 单独拿个线程死读,然后再同步数据,这个嘛,就有点多余了
: ...................
--
修改:speedboy2998 FROM 218.76.62.*
FROM 218.76.62.*
在不大改程序结构的情况下,的确是这样。
【 在 speedboy2998 的大作中提到: 】
: 所以就是把 future 都 move 到一个vector里,然后创建一个线程,在这个线程里轮询这些future 的状态,如果状态已经就绪,就callback,是这样吧?
:
--
FROM 115.193.160.*
应该有一个专门的工作线程去wait 然后wait的处理还必须在另外一个线程 否则就卡死了
【 在 speedboy2998 的大作中提到: 】
: 现在用一个库,对方提供的异步接口是基于 std::future的,无法理解。
: 以前使用基于 callback 函数的异步接口,我的调用现成调用完异步接口后,该干嘛干嘛,结果来了回调函数自动调用。
:
: 现在基于 future 的接口,返回一个 future, 我岂不是还要单独创建要
: ..................
发自「今日水木 on iPhone 11」
--
FROM 118.26.130.*