多线程中的临界区

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了多线程中的临界区相关的知识,希望对你有一定的参考价值。

临界区又叫关键代码段.在多线程共享变量时,用来安全读写共享变量.代码如下:

CRITICAL_SECTION???g_csSync?=?{};//临界区
INT???g_iData?=?0;

DWORD??WINAPI??WriteThreadProc(LPVOID?lpParameter)
{//写线程
	while?(1)
	{
		Sleep(30);
		__try
		{
			EnterCriticalSection(&g_csSync);
			g_iData++;
		}
		__finally
		{
			LeaveCriticalSection(&g_csSync);
		}
	}
	return?0;
}

DWORD?WINAPI??ReadThreadProc(LPVOID?lpParameter)
{//读线程
	while?(true)
	{
		Sleep(30);
		__try
		{
			EnterCriticalSection(&g_csSync);//进入临界区

			char?str[20]?=?{};
			itoa(g_iData,?str,?10);
			TRACE(str);
		}
		__finally
		{
			LeaveCriticalSection(&g_csSync);//离开临界区
		}
	}
	return?0;
}
void?CtestThreadDlg::OnBnClickedButton16()
{
	InitializeCriticalSectionAndSpinCount(&g_csSync,?0x4000);//初始化临界区

	DWORD??ThreadID?=?0;
	HANDLE??hThread[2]?=?{};
	hThread[0]?=?CreateThread(NULL,?0,?(LPTHREAD_START_ROUTINE)WriteThreadProc,?
	?????????????????????NULL,?CREATE_SUSPENDED,?&ThreadID);
	hThread[1]?=?CreateThread(NULL,?0,?(LPTHREAD_START_ROUTINE)ReadThreadProc,?
	?????????????????????NULL,?CREATE_SUSPENDED,?&ThreadID);

	ResumeThread(hThread[0]);
	ResumeThread(hThread[1]);

	WaitForMultipleObjects(2,?hThread,?TRUE,?INFINITE);

	CloseHandle(hThread[0]);
	CloseHandle(hThread[1]);

	DeleteCriticalSection(&g_csSync);//删除临界区
}


以上是关于多线程中的临界区的主要内容,如果未能解决你的问题,请参考以下文章

多线程相关------临界区CriticalSection

同步互斥的实现

多线程——临界区-锁

多线程多线程同步_Critical Section临界区

c++多线程问题

RT-Thread多线程导致的临界区问题