博客?`[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().**
- 前言
- 吐血整理C++11新特性
- C++11新特性之std::function
- c++11特性之正則表達式
- c++11特性之Lambda表達式
- c++11特性之override和final關鍵字
- c++11特性之std::thread--初識
- c++11特性之std::thread--初識二
- c++11特性之initializer_list
- c++11特性之std::thread--進階
- c++11特性之std::thread--進階二
- C++11新特性之 CALLBACKS
- C++11新特性之 std::array container
- C++11新特性之 nullptr
- C++11新特性之 rvalue Reference(右值引用)
- C++11新特性之 Move semantics(移動語義)
- C++11新特性之 default and delete specifiers
- C++11新特性之 Static assertions 和constructor delegation
- 開始使用C++11的幾個理由
- C++11新特性之 std::future and std::async