C+11 之前使用多线程都是使用pthread来进行线程的创建,繁琐且不易读,C++11引入了std::thread来创建线程,支持线程join或者detach:
#include <iostream> #include <thread> using namespace std; int main() { auto func = []() { for (int i = 0; i < 10; ++i) { cout << i << " "; } cout << endl; }; std::thread t(func); if (t.joinable()) { t.detach(); } auto func1 = [](int k) { for (int i = 0; i < k; ++i) { cout << i << " "; } cout << endl; }; std::thread tt(func1, 20); if (tt.joinable()) { // 检查线程可否被 join tt.join(); } return 0; }
以上代码中分别创建了两个线程,t与tt, 还创建了两个函数用来指定线程所要执行的函数, func与func1。
值得注意的时。在C++11之中规定,一个线程thread被创建之后,必须要调用 detach() 或者 join() 之后才能进行析构。否则会报错。
其中detach() 与 join() 的区别在于是否阻塞调用该函数的线程,join() 是阻塞调用该函数的线程, detach()是不进行阻塞。
其中阻塞并非立即阻塞,而是完成了正在进行的一个完整动作才进行阻塞!如下代码:
int main()
{
auto func1 = [](int k) { if (timed_mutex_.try_lock_for(std::chrono::milliseconds(10))) { for (int i = 0; i < k; i++) { cout << i << " "; } cout << endl; timed_mutex_.unlock(); } }; std::thread threads[5]; for (int i = 0; i < 5; ++i) { threads[i] = std::thread(func1, 10); } for (auto& th : threads) { th.join(); }
cout<<" 阻塞 ";
}
根据我原来的理解,第一次调用th.join() 主线程马上被阻塞,那么所创建的子线程也只是一个一个按顺序来进行创建的!那就不是并发了,但是实际情况是
程序完成了正在进行的动作for循环之后才被阻塞,所有for循环中创建的子线程执行完成了之后才进行cout。