多线程数据同步问题

在多线程编程中线程的执行没有先后顺序,有的时候需要对数据按照一定的顺序进行执行,执行的方式有临界区(Critiacal section),互斥量(mutex),事件(event),信号量(semaphsore)等方式可以实现,但互斥量会初始化一系列资源,通常不作为数据哦同步的方式。
在不行数据同步的情况下,代码和执行结果如下`:

#include<Windows.h>
#include<process.h>
#include<iostream>

using namespace std;
HANDLE hEvent{ 0 };
int m = 0;
unsigned int StartAddress(void* )
{
	while (true)
	{
			cout << "Second thread"<<(++m )<< endl;
	}
	return 0;
}

int main()
{

	unsigned               ThrdAddr = 0;
	uintptr_t                hThread{ 0 };
	hEvent = CreateEvent(nullptr, false, false, "");
	hThread = _beginthreadex(nullptr,0, (_beginthreadex_proc_type)StartAddress,nullptr,false, &ThrdAddr);
	while (true)
	{
		cout << "Main thread" << (++m) << endl;
	}
	return system("pause");
}


![非数据同步](https://img-blog.csdnimg.cn/20181228134358272.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzM3Nzc0MzA0,size_16,color_FFFFFF,t_70)

进行数据同步之后的代码:

#include<Windows.h>
#include<process.h>
#include<iostream>

using namespace std;
HANDLE hEvent{ 0 };
int m = 0;
unsigned int StartAddress(void* )
{
	while (true)
	{
		DWORD bFlag = WaitForSingleObject(hEvent, 30);
		if (bFlag == WAIT_OBJECT_0)
		{
			cout << "Second thread"<<(++m )<< endl;
			ResetEvent(hEvent);
			Sleep(5);
		}
	}
	return 0;
}

int main()
{

	unsigned               ThrdAddr = 0;
	uintptr_t                hThread{ 0 };
	hEvent = CreateEvent(nullptr, false, false, "");
	hThread = _beginthreadex(nullptr,0, (_beginthreadex_proc_type)StartAddress,nullptr,false, &ThrdAddr);
	while (true)
	{
		cout << "Main thread" << (++m) << endl;
		
		SetEvent(hEvent);
		Sleep(5);
	}
	

	return system("pause");
}

同步之后的结果

猜你喜欢

转载自blog.csdn.net/qq_37774304/article/details/85320943