zoukankan      html  css  js  c++  java
  • C++学习记录二:

    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。

  • 相关阅读:
    CentOS6设置密码过期时间
    scp
    windows查看进程
    mysql5.7密码问题
    mysql主从切换摘要
    mysql慢日志管理
    Linux学习(一)
    Linux学习(一)
    数据结构与算法(1)-算法时间复杂度
    数据结构与算法(1)-算法时间复杂度
  • 原文地址:https://www.cnblogs.com/ywc1/p/14490544.html
Copyright © 2011-2022 走看看