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())); // 1
std::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));