c++11多线程编程(第三讲)

#include <iostream>
#include <thread>
#include <string>
using namespace std;

 //自己创建一个线程,也需要从一个函数开始运行;
//void my_print(const int i, char *p_myBuf)
void my_print(const int i, const string &p_myBuf)
{
    cout<<"i:"<<i<<endl;
    //分析认为,i并不是m1的引用,实际是值传递,那么即使主线程结束,也不是影响子线程的这个变量的使用
    cout<<"p_myBuf:"<<p_myBuf<<endl;
    //指针在deatch子线程时,绝对会有问题,所以这边一定不能传指针
    return;
}
int main()
{
    /*
   一:传递零时对象作为线程参数
    (2.1)只要用临时构造的A类对象作为参数传递给线程,那么就一定能够在主线程执行完毕前把线程函数的参数构造出来
    若传递int这样的简单类型参数,建议都是值传递,不要使用引用,仿真主线程结束变量被释放造成问题。
    如果传递类对象,避免隐式转换。全部都在创建线程这一行就构建出临时对象来,然后在函数参数里使用引用来接。
    如果不使用引用,那么会多调用一次拷贝构造函数。
    (2.2)
    二:临时对象作为线程参数
    线程id的概念: id是一个数字,每个线程(不管是主线程还是子线程)实际上都对应着一个数字。
    不同线程的id必然是不一样的。
    线程id可以用c++标准库中的函数来获取std:this_thread::get_id();
    */
    int m1=1;
    int &m2 = m1;
    char mybuf[] = "this is a test!";
    //实际上mybuf被回收了(main执行完了)系统才用mybuf转成string,这样会出问题
    //std::thread my_thread4(my_print, m1, mybuf);
    将mybuf转换成一个零时对象,这样就能保证不出问题。
    std::thread my_thread4(my_print, m1, string(mybuf));
    //my_thread4.join();
    my_thread4.detach();//子线程和主线程分别执行
    cout << "Hello world!" << endl;
    return 0;
}

-----------------------------------------------------------------------------------------------------------------------------

#include <iostream>
#include <thread>
#include <string>
using namespace std;

class A
{
public:
    int m_i;
    A(int i):m_i(i)
    {
        cout << "构造函数执行了"<<this<<" thread ID:"<<std::this_thread::get_id()<< endl;
    }
    A(const A &a1):m_i(a1.m_i)
    {
        cout << "拷贝构造函数执行" <<this<<" thread ID:"<<std::this_thread::get_id()<< endl;
    }
    ~A()
    {
        cout << "析构函数执行" <<this<<" thread ID:"<<std::this_thread::get_id()<< endl;
    }
    void operator()()//不能带参数
    {
        cout << "我的线程 operator执行了" << endl;
        cout << "m_i的值为:"<<m_i<< endl;

    }
};

void myprint2(const A &pmybuf)
{
    cout<<"子线程 myprint2参数地址"<<&pmybuf
        <<"threadid:"<<std::this_thread::get_id()<<endl;
}

int main()
{
    /*
    (2.2)
    二:临时对象作为线程参数
    线程id的概念: id是一个数字,每个线程(不管是主线程还是子线程)实际上都对应着一个数字。
    不同线程的id必然是不一样的。
    线程id可以用c++标准库中的函数来获取std::this_thread::get_id();

    */
    cout<<"主线程ID:"<<this_thread::get_id()<<endl;
    int m1=1;
    //在主线程中使用临时对象来传递,就会线程安全。
    //传递类对象时就使用引用接收主线程中创建线程时的临时对象,这样能确保线程安全和少调用一次拷贝构造函数。
    std::thread my_thread5(myprint2,A(m1));

    char mybuf[] = "this is a test!";
    //my_thread5.join();
    my_thread5.detach();//子线程和主线程分别执行
    cout << "Hello world!" << endl;
    return 0;
}

智能指针作为线程函数的参数
void my_print(unique_ptr<int> pIn)//线程函数
{
    cout<<"my_print"<<<<"threadId:"<<std::this_thread::get_id()<<endl;
    
}

int main()
{
    unique_ptr<int> pInt(new int(100));
    std::thread myjob_th(my_print,std::move(pInt));
    myjob_th.join();
    //myjob_th.detach();
    
    
    return 0;
}

发布了101 篇原创文章 · 获赞 73 · 访问量 12万+

猜你喜欢

转载自blog.csdn.net/usstmiracle/article/details/104138993