两个线程,一个打印奇数,一个打印偶数

 

题目:实现两个线程,一个打印奇数,一个打印偶数

思路(1):用c++11的互斥量mutex,条件变量condition_variable.一个全局变量i,控制每个线程获取互斥锁后执行一次,再通过条件变量唤醒另一个等在该锁上的线程,让其执行,即保证两个线程交替运行。

#include 
#include 
#include 
#include 
#include 
std::mutex data_mutex;
std::condition_variable data_var;
bool flag = true;
int i = 0;

void printA()
{
	while (1)
	{
		Sleep(1000);
		unique_lock lck(data_mutex);
		data_var.wait(lck, [] {return flag; });//只有return flag==true时才不阻塞,上锁成功
		cout << "thread: " << this_thread::get_id() << "   printf: " << i << endl;
		i += 1;
		flag = false;
		data_var.notify_one();//释放锁,并唤醒等在该锁上的线程
	}
}

void printB()
{
	while (1)
	{
		unique_lock lck(data_mutex);
		data_var.wait(lck, []{return !flag; });
		cout << "thread: " << this_thread::get_id() << "   printf: " << i << endl;
		i += 1;
		flag = true;
		data_var.notify_one();
	}
}

思路(2):直接用一个全局的flag来控制两个线程交替运行,一个线程在flag==true可以执行,另一个线程在flag==false的时候执行。

void printA()
{
	while (1)
	{
		Sleep(1000);
		if (flag)
		{
			cout << "thread: " << this_thread::get_id() << "   printf: " << i << endl;
			i += 1;
			flag = false;
		}
		
	}
}

void printB()
{
	while (1)
	{
		if (!flag)
		{
			cout << "thread: " << this_thread::get_id() << "   printf: " << i << endl;
			i += 1;
			flag = true;
		}
	}
}

 

你可能感兴趣的:(GLUTEN)