更好的实践:循环线程或连续线程?

时间:2017-05-23 00:44:50

标签: c++ multithreading c++11

目前,我的应用程序定期调用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);
}

1 个答案:

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