C++多线程学习笔记02

1.包含头文件 thread

主程序从main()开始执行,进程是否完毕标志是 主线程 是否完毕
所以一般情况:想保持子线程运行状态,主线程要一直保持运行。

创建线程:
1.函数
thread mytobj(myprint); // 创建线程 myprint可调用对象
2.类对象
TA ta;
thread mytoj1(ta);
3.lambda表达式
auto mylambda = [] {
cout << “我的线程开始” << endl;
cout << “我的线程结束” << endl;
};
thread mytoj2(mylambda);

线程函数:

  1. mytobj.join();//阻塞主线程,让主线程等待子线程执行完毕,当执行完毕,主线程继续执行;
    注意:主线程要等待子线程执行完毕后,才能退出(传统的)
    2.mytobj.detach();//主线程与子线程分离执行
    注意:一旦detach()与主线程失去联系,由运行时刻接管,清理相关资源。
    一旦使用detach()后不能使用join();
    3.joinable();判断是否可以成功使用join()或detach(),返回true可以join()or detach(),false不能;

函数对象

// 线程.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include<iostream>
using namespace std;
#include<thread>
//创建线程从一个初始函数开始运行
void myprint()
{
	cout << "线程开始执行" << endl;
	cout << "线程开始执行" << endl;
	cout << "线程开始执行" << endl;
	cout << "线程开始执行" << endl;
	cout << "线程开始执行" << endl;
	cout << "线程执行结束" << endl;
}

int main()
{


	thread mytobj(myprint);   // 创建线程  myprint可调用对象
	
	mytobj.join();//阻塞主线程,让主线程等待子线程执行完毕,当执行完毕,主线程继续执行;


	//1.3 joinable();判断是否可以成功使用join()或detach(),返回true可以join()or detach(),false不能;
	
	if (mytobj.joinable())
	{
		cout << "joinable == true" << endl;
		mytobj.join();
	}
	else
		cout<< "joinable == false" << endl;

	/*mytobj.detach();
	if (mytobj.joinable())
		cout << "joinable == true" << endl;
	else
		cout << "joinable == false" << endl;*/
	
	cout << "I LOVE HE DAN " << endl;
	
    return 0;
}


类对象

// 线程.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include<iostream>
using namespace std;
#include<thread>


//创建线程从一个初始函数开始运行
class TA
{
public:
	void operator()()
	{
		cout << "线程开始执行" << endl;
		cout << "线程开始执行" << endl;
		cout << "线程开始执行" << endl;
		cout << "线程开始执行" << endl;
		cout << "线程开始执行" << endl;
		cout << "线程执行结束" << endl;
	}
};

int main()
{

	//2.类对象
	//主线程结束,这个对象实际上被复制 到线程中去,执行完主程序后,ta会被销毁,但所复制的ta对象依旧存在。
	//所以,只要这个TA类对象里没有引用、指针,就不会产生问题。
	
	TA ta;
	thread mytoj1(ta);
	mytoj1.join();
	cout << "I LOVE HE DAN " << endl;
	
    return 0;
}


lambda表达式

// 线程.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include<iostream>
using namespace std;
#include<thread>

int main()
{
	//3.用lambda表达式
	auto mylambda = [] {
		cout << "我的线程开始" << endl;
		cout << "我的线程结束" << endl;
	};

	thread mytoj2(mylambda);
	mytoj2.join();

	cout << "I LOVE HE DAN " << endl;
	
    return 0;
}


上一篇:数据结构实验——模拟停车场


下一篇:Aizu - 0121