线程创建
在c++11中引入头文件#include(C++11的标准库中提供了多线程库),该头文件中定义了thread类 创建一个线程即实例化一个该类的对象,实例化对象时候调用的构造函数需要传递一个参数,该参数就是函数名,thread th1(proc1); 如果传递进去的函数本身需要传递参数,实例化对象时将这些参数按序写到函数名后面,thread th1(proc1,a,b); 只要创建了线程对象(传递“函数名/可调用对象”作为参数的情况下),线程就开始执行(std::thread 有一个无参构造函数重载的版本,不会创建底层的线程)。
线程的创建原则
- 程序库不应该在未提前告知的情况下创建自己的背景线程
- 尽量用相同的方式创建线程
- 进入main函数之前不应该启动线程
- 程序中线程的创建最好能在初始化阶段全部完成。
如何创建线程
- 通过函数
- 通过类对象创建线程
- 通过lambda表达式创建线程
#pragma once
#include <iostream>
#include <thread>
using namespace std;
namespace CThread
{
void myPrint()
{
cout << "函数线程开始运行" << endl;
cout << "函数线程运行结束了" << endl;
}
class CObject
{
public:
void operator ()() {
cout << "类线程开始运行" << endl;
cout << "类线程开始运行1" << endl;
cout << "类线程开始运行2" << endl;
cout << "类线程开始运行3" << endl;
cout << "类线程开始运行4" << endl;
cout << "类线程开始运行5" << endl;
cout << "类线程开始运行6" << endl;
cout << "类线程结束运行" << endl;
}
};
class ThreadTest
{
public:
ThreadTest();
~ThreadTest();
private:
void functionCreate();
void classCreate();
void lambdaCreate();
};
ThreadTest::ThreadTest()
{
cout << "进程开始了" << endl;
functionCreate();
classCreate();
lambdaCreate();
cout << "进程结束了" << endl;
cout << "进程结束了" << endl;
cout << "进程结束了" << endl;
cout << "进程结束了" << endl;
cout << "进程结束了" << endl;
cout << "进程结束了" << endl;
cout << "进程结束了" << endl;
cout << "进程结束了" << endl;
}
ThreadTest::~ThreadTest()
{
}
void ThreadTest::functionCreate()
{
std::thread l_thread(CThread::myPrint);
l_thread.join();
}
void ThreadTest::classCreate()
{
CObject obj;
std::thread l_thread(obj);
l_thread.detach();
}
void ThreadTest::lambdaCreate()
{
auto myLamThread = [] {
cout << "lambda线程开始运行" << endl;
cout << "lambda线程结束运行" << endl;
};
thread l_thread(myLamThread);
if (l_thread.joinable()) {
l_thread.join();
}
}
}
|