目前,我的应用程序定期调用REST API,我正在使用一个专用线程来执行此操作(request()是对象的方法):
void MyObject::request() {
while (m_continue) {
//API call, printing response, then sleeping 30 secs
usleep(30*1000);
}
}
制作一个类似的线程:
thread t(&MyObject::request, this);
t.detach();
但是使用c ++ 11或Boost,使用永远循环的线程比使用多个连续的线程/异步函数更好吗?
像这样:
string MyObject::request() {
//API call, printing response
}
并多次调用它,使用未来结果并每次异步调用request():
while (m_continue) {
future<string> f = async(request);
cout << f.get() << endl;
usleep(30*1000);
}
答案 0 :(得分:2)
是的,使用“一个永远循环的线程”。由于std::async
,您将有相当大的开销。在您致电std::async
时,您将创建一个新线程。
因此,最好只创建一次,然后定期调用您的API。
“<future>
”类,函数等,如std::async
,有很好的接口用于任务的并行化,但在幕后他们使用内核线程(就像std::thread
那样) ,它表示pthreads
或Windows线程或平台提供的任何内容。所以它们对于定期发生的事情并不是非常有用,一旦你一直在创建线程并且它有相当大的成本。
以下是来自CppCon 2014的非常精彩的视频,其中包含深入的细节和基准: https://www.youtube.com/watch?v=5xyztU__yys
-
顺便说一下,没有问题,但为什么不使用this_thread::sleep_for()
? : - )
void MyObject::request() {
while (m_continue) {
//API call, printing response, then sleeping 30 secs
this_thread::sleep_for(chrono::seconds(30));
}
}