欢迎使用CSDN-markdown编辑器

来源:互联网 发布:天下3用数据流量玩 编辑:程序博客网 时间:2024/06/06 02:50

C++简单多线程

c++多线程里面除了指定函数开始新线程外,也可以用可调用(callable)类型构造,将带有函数调用符类型的实例传入std::thread类中,替换默认的构造函数。代码如下:
  // test.cpp : 定义控制台应用程序的入口点。//#include "stdafx.h"#include <iostream>#include <thread>using namespace std;void hello(int k){    //static int num = 1;    cout << "hello" <<k<< endl;}class background_task{public :    background_task(){        mark = new int(1);        cout << "Hello ,this is background_task" << endl;    }    void operator() () const{        for (int i = 0; i < 10;i++)        cout << *mark << endl;        cout << "This is operator" << endl;    }    void setMark(){        ( *mark) ++;    }    void  getPutMark(){        cout << "This is GetPut" << *mark << endl;    }private :    int* mark;};int _tmain(int argc, _TCHAR* argv[]){    background_task k;    thread t(k);    k.setMark();    k.getPutMark();    t.join();    return 0;}

在代码里面,我们创建了一条多线程,其中类内的变量mark可以换成一个int的类型,这里声明为指针主要是为了验证thread t(k)是否复制了了k对象的资源。因此共享资源时候,要将共享的资源声明为一个指针的形式,不然线程只改变其副本。

值得注意的是thread()中不可用临时对象变量,要用命名对象,不然C++编译器会将其解析为函数声明而非类型对象定义如下:
thread my_thread(background_task());
这里的声明相当于声明了一个名为my_thread的函数,参数为一个返回为background_task对象,参数为空的函数。
解决方法有

std::thread my_thread((background_task()));  // 1std::thread my_thread{background_task()};    // 2

也可以用lambda表达式改写上述例子。

std::thread my_thread([]{  do_something();  do_something_else();});

在thread传递参数时,要注意默认参数要拷贝到线程独立内存里,即使参数是引用格式:

void f(int i, std::string const& s);std::thread t(f, 3, "hello");

这里的hello本来就不能直接赋值给s的,也可以从这看出。

当然你可以加上ref要说明这是传递引用参数。

thread t(hello,ref(ka));
0 0
原创粉丝点击