zoukankan      html  css  js  c++  java
  • C++11并发编程3------线程传参

    /*
    基本类型传值
    */
    #include <iostream>
    #include <thread>
    
    void func(int num)
    {
        num = 100;
        std::cout << "func: " << num << std::endl;
    }
    
    int main()
    {
        int num = 10;
        std::thread my_job(func, num);
        my_job.join();
    
        std::cout << "main: " << num << std::endl;
        return 0;
    }
    /*
    基本类型传引用
    */
    #include <iostream>
    #include <thread>
    
    void func(int &num)
    {
        num = 100;
        std::cout << "func: " << num << std::endl;
    }
    
    int main()
    {
        int num = 10;
        std::thread my_job(func, std::ref(num));
        my_job.join();
    
        std::cout << "main: " << num << std::endl;
        return 0;
    }
    /*
    类类型传值
    */
    #include <iostream>
    #include <thread>
    
    class A
    {
    public:
        int num_;
        A(int num) : num_(num)
        {
            std::cout << "A(int num)" << std::endl;
        }
        A(const A &a) : num_(a.num_)
        {
            std::cout << "A(const A &a)" << std::endl;
        }
        ~A()
        {
            std::cout << "~A()" << std::endl;
        }
    };
    
    void func(A a)
    {
        std::cout << "a.num_ = " << a.num_ << std::endl;
        a.num_ = 100;
    }
    
    int main()
    {
        A a(10);
        std::thread my_job(func, a);
        my_job.join();
    
        std::cout << "main : a.num_ = " << a.num_ << std::endl;
        return 0;
    }

    类类型传值执行结果:多次调用拷贝构造函数,影响效率,所以不推荐这种做法

    /*
    类类型传引用
    */
    #include <iostream>
    #include <thread>
    
    class A
    {
    public:
        int num_;
        A(int num) : num_(num)
        {
            std::cout << "A(int num)" << std::endl;
        }
        A(const A &a) : num_(a.num_)
        {
            std::cout << "A(const A &a)" << std::endl;
        }
        ~A()
        {
            std::cout << "~A()" << std::endl;
        }
    };
    
    void func(A &a)
    {
        std::cout << "a.num_ = " << a.num_ << std::endl;
        a.num_ = 100;
    }
    
    int main()
    {
        A a(10);
        std::thread my_job(func, std::ref(a));
        my_job.join();
    
        std::cout << "main : a.num_ = " << a.num_ << std::endl;
        return 0;
    }

     如果希望子线程里面不修改对象的内容,形参可加const修饰。

    /*
    传智能指针
    */
    #include <iostream>
    #include <thread>
    
    void func(std::unique_ptr<int> int_ptr)
    {
        std::cout << *int_ptr << std::endl;
    }
    
    int main()
    {
        std::unique_ptr<int> int_ptr(new int(10));
    
        std::thread my_job(func, std::move(int_ptr));
        my_job.join();
    
        return 0;
    }
  • 相关阅读:
    12.7 Test
    51Nod.1766.树上最远点对(树的直径 RMQ 线段树/ST表)
    BZOJ.3675.[APIO2014]序列分割(DP 斜率优化)
    BZOJ.4515.[SDOI2016]游戏(树链剖分 李超线段树)
    BZOJ.3165.[HEOI2013]Segment(李超线段树)
    Linux系统CentOS进入单用户模式和救援模式详解
    KVM 管理界面挂载多UKEY
    挂载银行前置机Ukey到windows server2012虚拟机的操作记录
    为什么服务器做了raid 系统文件还会丢失?
    LVS+Keepalived深度理解,阐述你不知道的坑点
  • 原文地址:https://www.cnblogs.com/418ks/p/11583460.html
Copyright © 2011-2022 走看看