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。

posted on 2021-03-06 14:22  Russell。  阅读(40)  评论(0编辑  收藏  举报