1. 程式人生 > >多執行緒資料同步問題

多執行緒資料同步問題

在多執行緒程式設計中執行緒的執行沒有先後順序,有的時候需要對資料按照一定的順序進行執行,執行的方式有臨界區(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");
}

同步之後的結果