C++ thread学习四(使用async创建线程并返回结果)

使用async创建一个新线程,返回一个future类型的对象,可以使用这种方法从线程中返回值。基本语法为:

std::future<线程函数返回值类型> res = std::async(标记, 线程入口函数);

标记常用的有std::launch::deferred和std::launch::async。

std::launch::async:意思是为当执行此行语句时线程被创建并开始执行,但是如果此线程没有被执行完,会被阻塞在res.get()或者res.wait(),直到执行完才被返回。

std::launch::deferred:不会创建新线程,当主线程执行到res.get()或者res.wait()之后会执行新线程里的内容并返回,效果类似与函数调用。

std::launch::async | std::launch::deferred:为系统默认缺省参数,含义为操作系统自行决定是否是async还是deferred(一般会创建新线程,但是如果系统资源紧张就会在当前线程执行)。

先看一个简单的例子:

#include 
#include 
#include 
#include 

int mythread()
{
    sleep(3);
    std::cout << "another thread starts, thread id is " << std::this_thread::get_id() << '\n';
    std::cout << "another thread ends\n";
    return 10;
}
int main(int argc, const char * argv[])
{
    std::cout << "main thread starts, thread id is " << std::this_thread::get_id() << '\n';
    std::cout << "main thread is executing..." << '\n';
    // 1. 第一个参数std::launch::async含义为当执行此行语句时线程被创建并开始执行,但是如果此线程没有被执行完,会被阻塞在res.get()或者res.wait()。
    // 2.如果第一个参数为std::launch::deferred,那么该线程不会被创建,当主线程执行到res.get()或者res.wait()之后会执行新线程里的内容并返回,效果类似与函数调用。
    // 缺省第一个参数相当于参数为std::launch::deferred | std::launch::async,由系统自行决定使用哪种方式。
    // std::future res = std::async(std::launch::deferred, mythread);
    // std::future res = std::async(std::launch::async, mythread);
    std::future res = std::async(std::launch::async | std::launch::deferred, mythread);
    std::cout << "return value is \n" << res.get() << '\n';
    std::cout << "main thread ends\n";
}

使用std::launch::async执行结果:

C++ thread学习四(使用async创建线程并返回结果)_第1张图片

以上结果可知,执行到std::future res = std::async(std::launch::async, mythread);语句时线程被创建并开始执行,但是主线程被阻塞在res.get(),直到新线程被执行完返回结果,主线程才继续执行。

使用std::launch::deferred执行结果:

C++ thread学习四(使用async创建线程并返回结果)_第2张图片

以上结果可知,执行到std::future res = std::async(std::launch::async, mythread);语句之后并没有创建新线程,直到主线程执行到res.get(),线程入口函数才被当成普通函数开始继续执行,由于主线程id和新线程id一样,证明了并没有新线程被创建,原因可能是这里既然效果等同于函数调用,编译器就自动优化了,节省了创建新线程的开销。

------------------------------------------------------------------------------分割线--------------------------------------------------------------------------------------

原来写创建async缺省参数为std::launch::async,其实是为std::launch::async | std::launch::deferred,现已更正。

你可能感兴趣的:(服务器,C++)