进程与线程
每一个进程都有一个主线程,且是唯一的。当进程产生后,主线程就随进程开始启动了。主线程来执行main函数。线程用来执行代码,线程就是代码的一条执行通路。除了主线程外,用户可以创建其他线程。
C++11新标准线程库
template< class Function, class... Args >
explicit thread( Function&& f, Args&&... args );
1. 使用普通函数创建线程
#include <thread>
void myFunc(void) {
cout << "This is create Thread!" << endl;
return;
}
int main(int argc, char* argv[]) {
thread test(myFunc);//创建线程并执行函数
test.join();//等子线程运行完和主线程汇合在执行下面的代码段
cout << "This is main thread" << endl;
return 0;
}
detach():
线程分离,也就是主线程和子线程不汇合。主线程可以提前结束。join()
都需要主线程等待子线程退出。一旦调用detach()
,与这个主线程关联的thread
对象就会失去和主线程的关联,此时子线程就会在后台运行。被C++运行时库接管,当子进程执行完后,由运行时库负责清理资源。线程会失去控制,推荐使用join()
。 joinable()
:判断是否可以成功使用join()
或者detach()
。返回true
(可以使用)。
使用带参数的函数创建线程:
thread myThread(函数名, 函数的参数列表)
2. 使用类对象创建
需要使得类对象是可调用的。需要重载operator()
操作符。
class Test{
public:
//可调用对象,需要重载()运算符,不能带参数
void operator()() {
cout << "class create thread " << endl;
// ....
cout << "thread ending " << endl;
}
};
int main(int argc, char* argv[]) {
cout << "Hello World!\n";//主线程在执行,主线程从main函数返回,则进程执行完毕。
//两个线程在跑,一起走,平行的。即使一条线堵住,另一条线也能执行。
Test tmp;
thread obj(tmp);
obj.join();
cout << "--------main thread ending---------" << endl;
return 0;
}
将main函数的局部对象调用拷贝构造函数复制到子线程当中。当主线程中的对象析构后,子进程中的对象依然存在。
3. 使用类成员函数创建线程
//构造函数的第一个参数是类成员指针,第二个参数是类对象指针
//如果需要给成员指针传递参数,则从第三个参数开始
thread cal_task(&className::functionName, &Instance);