• 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;
    }
  • 相关阅读:
    Linux服务器管理: 系统的定时任务crond
    Nmon的安装使用及获取报表
    笔记:LoadRunner性能测试巧匠训练营
    python-解决安装MySQL-python出现的: Python version 2.7 required,which was not found in the registry
    JMeter监控内存及CPU——plugin插件监控被测系统资源方法
    Linux监控
    SSL与TLS的区别以及介绍
    [存]Jmeter 如何实现跨线程组传递参数
    Robot Framework简介
    [转]Appium搭建六:安装Android模拟器
  • 原文地址:https://www.cnblogs.com/418ks/p/11583460.html
Copyright © 2020-2023  润新知