//程序清单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;
}
//程序清单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;
}
网友评论