Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/161.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 更好的实践:是否循环线程或连续线程?_C++_Multithreading_C++11 - Fatal编程技术网

C++ 更好的实践:是否循环线程或连续线程?

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 } 并多次调用它,

目前,我的应用程序正在周期性地调用REST API,我正在使用一个专用线程来实现这一点(request()是一个对象的方法):

做一条线,就像:

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));
    }
}