zoukankan      html  css  js  c++  java
  • c++ 多线程笔记1

    参考:https://baptiste-wicht.com/posts/2012/03/cpp11-concurrency-part1-start-threads.html#

    1. 创建线程

    使用std::thread构造线程,当你创建一个线程,需要给线程代码,其中一个选择便是传函数指针。所有的线程工具都在thread 头文件中。

    #include <thread>
    #include <iostream>
    
    void hello(){
        std::cout << "Hello from thread " << std::endl;
    }
    
    int main(){
        std::thread t1(hello);
        t1.join(); 
    /*Calling this function forces current to wait for the other one.
    * the main thread has to wait for the thread t1 to finish.
    */
        return 0;
    }

    这里的 join() 使得main线程需要等待t1线程结束。如果没有调用join(),结果将不确定,因为main线程可能在t1线程结束前从main函数返回。

    2. 线程区分

    每个线程都有一个id供我们区分,std::thread类有一个get_id()函数能返回特定线程的id号。需要 std::this_thread命名空间的 get_id()函数。

    #include <thread>
    #include <iostream>
    #include <vector>
    
    void hello(){
        std::cout << "Hello from thread " << std::this_thread::get_id() << std::endl;
    }
    
    int main(){
        std::vector<std::thread> threads;
    
        for(int i = 0; i < 5; ++i){
            threads.push_back(std::thread(hello));
        }
    
        for(auto& thread : threads){
            thread.join();
        }
    
        return 0;
    }
    /*输出:
    *Hello from thread.139920874026752
    *Hello from thread.139920882419456
    *Hello from thread.139920890812160
    *Hello from thread.139920899204864
    *Hello from thread.139920907597568
    */

    3. lambda 

    当代码量比较小而不用另一个函数描述时候,可以用lambda去定义:

    #include <thread>
    #include <iostream>
    #include <vector>
    
    int main(){
        std::vector<std::thread> threads;
    
        for(int i = 0; i < 5; ++i){
            threads.push_back(std::thread([](){
                std::cout << "Hello from thread " << std::this_thread::get_id() << std::endl;
            }));
        }
    
        for(auto& thread : threads){
            thread.join();
        }
    
        return 0;
    }

    实现了同样的功能,不过是用lambda 表达代替了函数指针。

    The Safest Way to Get what you Want is to Try and Deserve What you Want.
  • 相关阅读:
    [模板] 文艺平衡树
    [模板]平衡树splay
    [ZJOI2015]诸神眷顾的幻想乡
    [HAOI2016]找相同字符
    SP8093 JZPGYZ
    SP1812 LCS2
    SP1811 LCS
    AHOI2013 差异
    TJOI2015 弦论
    工艺(SAM)
  • 原文地址:https://www.cnblogs.com/Shinered/p/9078844.html
Copyright © 2011-2022 走看看