美文网首页
多线程c++学习

多线程c++学习

作者: 芒果浩明 | 来源:发表于2018-09-11 19:57 被阅读0次
  • helloworld简单调用例子
//程序清单1.1
//hello concurrent world

#include<iostream>
#include<thread> //管理线程的类和函数在<thread>中声明

void helloWorld()//线程初始函数
{
    std::cout << "Hello concurrent world!" << std::endl;
}

int main()
{

    std::thread t(helloWorld);//helloWorld作为t对象的初始函数
    t.join();//jion()的形式开启线程
    system("pause");
    return 0;
}
  • 如何初始化线程(thread对象)
//程序清单1.2
//启动线程
#include<iostream>
#include<thread>

//简单的函数构造thread对象
void doSomeWork()
{
    std::cout << "do some work" << std::endl;
}


//thread调用类型构造,将带有函数调用符传入thread对象
void doSomeThing()
{
    std::cout << "do some thing" << std::endl;
}
void doSomeThineElse()
{
    std::cout << "do some thine else" << std::endl;
}
class BackGroundTask {
public:
    //重载()号
    void operator ()()const
    {
        doSomeThing();
        doSomeThineElse();
    }
};


int main()
{
    std::thread simpleTread(doSomeWork);
    simpleTread.join();

    BackGroundTask f;
    std::thread classThread(f);
    
    //错误初始化线程
    std::thread wrongTread(BackGroundTask());//错误初始化线程,这里相当于声明了一个名为wrongTread()函数,这个函数带一个参数,参数为BackGroundTask(),返回值为std::thread对象

    //正确方式
    std::thread rightTread1((BackGroundTask()));//多加一个()
    std::thread rightTread2{ BackGroundTask() };//使用c++11统一初始化方式
    std::thread rightTread3([]() {doSomeThing(); doSomeThineElse(); });//使用lambda表达式

    system("pause");
    return 0;
}
//程序清单2.1
//函数已经结束,线程依旧访问局部变量

#include<iostream>
#include<thread>

struct Func
{
    int &i;
    Func(int& i_) : i(i_) {};//类型为引用的成员变量只能由初始化列表初始化
    void operator() ()
    {
        for (size_t j = 0; j < 1000000; ++j)
            doSomethingI();
    }
    void doSomethingI()
    {
        std::cout << i << std::endl;
    }
};

void createThread()
{
    int local_var = 0;//局部变量
    Func my_func(local_var);
    std::thread my_thread(my_func);
    my_thread.detach();//分离式启动线程,createThread()函数不等待线程结束
    //函数结束,线程可能还在运行
    //即函数结束, 局部变量被销毁了,线程还在访问局部变量 local_var,结果是输出未定义的
}
int main()
{
    createThread();
    system("pause");
    return 0;
}

相关文章

网友评论

      本文标题:多线程c++学习

      本文链接:https://www.haomeiwen.com/subject/deaugftx.html