用Thread创建多线程的C++程序

代码比较乱,素材也是来自网络,如果有什么问题可以联系我处理。

这份代码给出了一种简单创建多线程的方法,创建线程时传入函数地址即可。当然还有别得方法像CreateThread,自认为该方法比较复杂

#include
#include
using namespace std;

void foo()//简单的无参函数
{
	cout << "Hello World." << endl;
}

void foo2(const char *name)//简单的有参函数
{
	cout << "Hello " << name << endl;
}

class Greet
{
	const char *owner = "Greet";
public :
	void SayHello();
};
void Greet :: SayHello()//有参函数
{
	char name[100]="万晨";
	//cin >> name;
	cout << "Hello " << name << "from " << this->owner << endl;
}



void pausable()
{
	this_thread::sleep_for(chrono::milliseconds(500));
	this_thread::sleep_until(chrono::system_clock::now() + chrono::milliseconds(500));
}

class Ta
{
public:
	void operator()()//重载括号
	{
		cout << "我是类对象函数" << endl;;
	}
};
int main()
{
	thread t(foo);//启动线程foo
	t.join();  //等待线程执行完成

	thread t2(foo2, "陈碧云");//创建线程时传入参数
	t2.join();

	char c[10] = "asdfasdf";
	Greet greet;//类成员函数
	thread t3(&Greet::SayHello, &greet);//类函数要传入函数地址和对象地址
	t3.join();

	thread t4(pausable);
	if (t4.joinable())
	{
		cout << "可以进行detach或者join" << endl;
	}
	else
	{
		cout << "不能进行detach或者join" << endl;
	}

	t4.detach();//将主线程和子线程分离

	if (t4.joinable())
	{
		cout << "可以进行detach或者join" << endl;
	}
	else
	{
		cout << "不能进行detach或者join" << endl;
	}


    //调用类对象来创建线程
	Ta ta;
	thread t5(ta);
	t5.join();

	//用lambda表达式来创建线程
	auto mylamthread = []
	{
		cout << "我是lambda表达式创建的线程" << endl;
	};
	thread t6(mylamthread);
	t6.join();

	system("pause");
	return 0;
}

这里对这段代码中的几个点作简要说明:

  • thread是一个标准库中的一个类,实质还是类。
  • join的作用是等待子线程执行完毕,其实就是在此处将主线程阻塞,留给子线程足够的时间去运行,直到子线程运行结束,才将主线程唤醒。
  • 在子线程没有结束的情况下,主线程提前结束就会出错。
  • detach的作用是分离主线程和子线程,也就是主线程不必等待子线程运行结束,而且主线程结束后子线程也能正常结束。detach()后,子线程脱离主线程驻留在后台运行,有C++运行时库接管,子线程运行结束后也是由运行时库负责清理相关资源。(守护线程)。
  • 一般情况下,我们会让主线程等待子线程运行结束,一旦两者脱离,我们就很难掌握线程的执行情况。一旦脱离就不能再抓回来了。
  • joinable()函数,判断是否可以成功使用join和detach,若可以则返回真值,否者返回假值。join和detach两者是互斥的,不能两个同时使用。

你可能感兴趣的:(C++)