callable类型和多线程启动
- 返回值void,不接受参数的函数
void hello() { } std::thread t(hello); // 启动线程
- 类的实例,这个类支持void operator ()();
class background_task{ public: void operator ()() { do_something(); } }; background_task f; std::thread my_thread(f); // 启动线程 // 错误示例1 std::thread my_thread(background_task()); // 错因 // 尝试传递一个临时的未命名的background_task类型的变量,企图构造一个线程并启动 // 然而,这个会被编译器解释为一个函数声明。 // 具体来说, // 就是一个返回类型为std::thread // 函数名为my_thread // 函数的参数类型是指向不接受参数同时返回background_task类型对象的函数的指针 // 换句话说是 // 函数的参数类型是一个函数指针,什么样的函数指针呢?这个函数指针是指向不接受参数同时返回background_task类型对象的函数 // 这个错误的确非常的隐蔽,不得不说真的强…… // // 如何正确的实现这个意图呢? std::thread my_thread( (background_task()) ); // 方法1 加一对小括号 std::thread my_thread{background_task()}; // 方法2 改用新的统一初始化方法——使用大括号
本文里面的代码大多来自于《C++并发变成实践》中的例子代码,版权不属于我。
网友评论