C++并发与多线程学习(1):线程的创建

进程与线程

每一个进程都有一个主线程,且是唯一的。当进程产生后,主线程就随进程开始启动了。主线程来执行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);
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值