多应用+插件架构,代码干净,二开方便,首家独创一键云编译技术,文档视频完善,免费商用码云13.8K 广告
博客 `[c++11特性之std::thread--初识](http://blog.csdn.net/wangshubo1989/article/details/49592517 "std::thread")`  讲了std::thread::join和std::thread::detach的用法。今天就再来点深入的。 先看看这个: ~~~ int main() { std::thread t(&thread_function); std::cout << "main thread\n"; // t.join(); t.detach(); t.join(); // Error return 0; } ~~~ **一旦 detached, 就不能再join**  这个时候总要有新东西出场了:  **joinable()** ~~~ #include <iostream> // std::cout #include <thread> // std::thread void mythread() { // do stuff... } int main() { std::thread foo; std::thread bar(mythread); std::cout << "Joinable after construction:\n" << std::boolalpha; std::cout << "foo: " << foo.joinable() << '\n'; std::cout << "bar: " << bar.joinable() << '\n'; if (foo.joinable()) foo.join(); if (bar.joinable()) bar.join(); std::cout << "Joinable after joining:\n" << std::boolalpha; std::cout << "foo: " << foo.joinable() << '\n'; std::cout << "bar: " << bar.joinable() << '\n'; return 0; } ~~~ 之前的例子中, 我们都是使用的普通的函数. 我们本可以使用更多,尤其你要牢记的就是c++是一个面向对象。 ~~~ #include <iostream> #include <thread> class MyFunctor { public: void operator()() { std::cout << "functor\n"; } }; int main() { MyFunctor fnctor; std::thread t(fnctor); std::cout << "main thread\n"; t.join(); return 0; } ~~~ 上面的代码,我创建了一个函数对象,把它付给一个线程任务 也许你会像下面这样写: ~~~ std::thread t(MyFunctor()); ~~~ 但是,编译时通不过的,你应该这样写: ~~~ std::thread t((MyFunctor())); ~~~ **必须加一个 () 来封装 MyFunctor().**