C++ 更好的实践:是否循环线程或连续线程?
目前,我的应用程序正在周期性地调用REST API,我正在使用一个专用线程来实现这一点(request()是一个对象的方法): 做一条线,就像:C++ 更好的实践:是否循环线程或连续线程?,c++,multithreading,c++11,C++,Multithreading,C++11,目前,我的应用程序正在周期性地调用REST API,我正在使用一个专用线程来实现这一点(request()是一个对象的方法): 做一条线,就像: thread t(&MyObject::request, this); t.detach(); 但是使用c++11或Boost,使用一个不断循环的线程比使用多个连续线程/异步函数更好吗? 像这样: string MyObject::request() { //API call, printing response } 并多次调用它,
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);
}
while(继续){
未来f=异步(请求);
是的,使用“一个不断循环的线程”。由于std::async
,您将有相当大的开销。您将在调用std::async
时创建一个新线程
所以最好只创建一次,然后定期调用API
“
”类、函数等,比如std::async
,有很棒的并行任务接口,但在幕后它们使用内核线程(就像std::thread
一样),它意味着pthreads
或windows线程或平台提供的任何东西。因此,它们对于周期性发生的事情不是很有用,因为您需要一直创建线程,而且成本相当高
以下是CppCon 2014的一段非常精彩的视频,其中包含了深入的细节和基准:
--
顺便说一下,你的问题没有什么问题,但是为什么不使用这个线程::sleep\u for()
?:-)
std::async
每次都会产生一个新线程吗?std::async
底层实现可以使用线程池,例如。是的@Rook,它可以。问题恰恰是这样。它们没有。只是就像视频解释一样…界面是通用的,它意味着“让我们并行化这个东西”…然而,它是通过内核线程完成的。我不确定标准是以这种方式限制的,还是只是实现的问题。由于这个确切的问题,视频为同一接口提出了其他实现;-)感谢您的回答,该视频真的很有帮助!
while (m_continue) {
future<string> f = async(request);
cout << f.get() << endl;
usleep(30*1000);
}
void MyObject::request() {
while (m_continue) {
//API call, printing response, then sleeping 30 secs
this_thread::sleep_for(chrono::seconds(30));
}
}