C++ 线程同步 (学习笔记)

1. 利用Mutex 互斥对象

#include <iostream.h> #include <windows.h> DWORD WINAPI Fun1Proc( LPVOID lpParameter ); DWORD WINAPI Fun2Proc( LPVOID lpParameter ); int tickets = 100; HANDLE hMutex; //互斥对象 int main() { HANDLE hThread1,hThread2; hThread1 = CreateThread(NULL,0,Fun1Proc,NULL,0,NULL); hThread2 = CreateThread(NULL,0,Fun2Proc,NULL,0,NULL); CloseHandle(hThread1); CloseHandle(hThread2); hMutex = CreateMutex(NULL,FALSE,NULL); Sleep(8000); return 1; } DWORD WINAPI Fun1Proc( LPVOID lpParameter ) { while (TRUE){ WaitForSingleObject(hMutex,INFINITE); //有信号时才返回 if(0 == tickets) break; cout<<"Thread1 sell tickets "<<tickets--<<endl; ReleaseMutex(hMutex);//释放互斥对象 } return 0; } DWORD WINAPI Fun2Proc( LPVOID lpParameter ) { while (TRUE){ WaitForSingleObject(hMutex,INFINITE); if(0 == tickets) break; cout<<"Thread2 sell tickets "<<tickets--<<endl; ReleaseMutex(hMutex);//释放互斥对象 } return 0; }

 

2. 利用Event 事件对象

#include <iostream.h> #include <windows.h> DWORD WINAPI Fun1Proc( LPVOID lpParameter ); DWORD WINAPI Fun2Proc( LPVOID lpParameter ); int tickets = 100; HANDLE hEvent; //事件 int main() { hEvent = CreateEvent(NULL,FALSE,FALSE,NULL); //创建事件 SetEvent(hEvent);//设置成有信号状态 HANDLE hThread1,hThread2; hThread1 = CreateThread(NULL,0,Fun1Proc,NULL,0,NULL); hThread2 = CreateThread(NULL,0,Fun2Proc,NULL,0,NULL); CloseHandle(hThread1); CloseHandle(hThread2); Sleep(8000); return 1; } DWORD WINAPI Fun1Proc( LPVOID lpParameter ) { while (TRUE){ WaitForSingleObject(hEvent,INFINITE); //事件有信号才返回 ResetEvent(hEvent); //设成无信号,以免其余线程访问 if(0 == tickets) break; cout<<"Thread1 sell tickets "<<tickets--<<endl; SetEvent(hEvent);//设为有信号,以供其余线程调用 } return 0; } DWORD WINAPI Fun2Proc( LPVOID lpParameter ) { while (TRUE){ WaitForSingleObject(hEvent,INFINITE); //事件有信号才返回 ResetEvent(hEvent); //设成无信号,以免其余线程访问 if(0 == tickets) break; cout<<"Thread2 sell tickets "<<tickets--<<endl; SetEvent(hEvent);//设为有信号,以供其余线程调用 } return 0; }

 

3. 利用临界区 CRITICAL_SECTION 效率更高

#include <iostream.h> #include <windows.h> DWORD WINAPI Fun1Proc( LPVOID lpParameter ); DWORD WINAPI Fun2Proc( LPVOID lpParameter ); int tickets = 100; CRITICAL_SECTION cs;//临界区 int main() { InitializeCriticalSection(&cs); //初始化临界区 HANDLE hThread1,hThread2; hThread1 = CreateThread(NULL,0,Fun1Proc,NULL,0,NULL); hThread2 = CreateThread(NULL,0,Fun2Proc,NULL,0,NULL); CloseHandle(hThread1); CloseHandle(hThread2); Sleep(8000); return 1; } DWORD WINAPI Fun1Proc( LPVOID lpParameter ) { while (TRUE){ EnterCriticalSection(&cs); //进入临界区 if(0 == tickets) break; cout<<"Thread1 sell tickets "<<tickets--<<endl; LeaveCriticalSection(&cs); //离开临界区 } return 0; } DWORD WINAPI Fun2Proc( LPVOID lpParameter ) { while (TRUE){ EnterCriticalSection(&cs); //进入临界区 if(0 == tickets) break; cout<<"Thread2 sell tickets "<<tickets--<<endl; LeaveCriticalSection(&cs); //离开临界区 } return 0; }

 

 4. 利用Semaphore信号量

/*
* FileName: Semaphore_Test.cpp 
* Author:   JarvisChu
* Date:     2012-11-22
*/

//#include <iostream>
#include <iostream>
#include <windows.h>

using namespace std;

DWORD WINAPI Fun1Proc(
	LPVOID lpParameter);

DWORD WINAPI Fun2Proc(
	LPVOID lpParameter);
DWORD WINAPI Fun3Proc(
	LPVOID lpParameter);

volatile int tickets = 100;
HANDLE hSemaphore;

int main()
{
	//必须先Create Semaphore 然后CreateThread

	hSemaphore = CreateSemaphore(NULL,
		1,//初始资源数 互斥的情况下必须为1 
		3,//最大资源数,互斥的情况下意义不大
		NULL    //Unnameed semaphore
		);
	if(hSemaphore == NULL) cout<<"Create Semaphore Failed!"<<endl;

	HANDLE hThread1,hThread2,hThread3;
	hThread1 = CreateThread(NULL,0,Fun1Proc,NULL,0,NULL);	
	hThread2 = CreateThread(NULL,0,Fun2Proc,NULL,0,NULL);
	hThread3 = CreateThread(NULL,0,Fun3Proc,NULL,0,NULL);

	CloseHandle(hThread1);
	CloseHandle(hThread2);
	CloseHandle(hThread3);

	
	Sleep(800);
	return 0;
}

DWORD WINAPI Fun1Proc(LPVOID lpParameter)
{
	while (TRUE)
	{
		DWORD nWaitResult;
		nWaitResult = WaitForSingleObject(hSemaphore,INFINITE);

		if(tickets >0)
			cout<<"Thread1 Sailed ticket "<<tickets--<<endl;
		else
			break;
		ReleaseSemaphore(hSemaphore,1,NULL);
	}
	return 0;
}


DWORD WINAPI Fun2Proc(LPVOID lpParameter)
{
	while (TRUE)
	{
		DWORD nWaitResult;
		nWaitResult = WaitForSingleObject(hSemaphore,INFINITE);
		if(tickets >0)
			cout<<"Thread2 Sailed ticket "<<tickets--<<endl;
		else
			break;
		ReleaseSemaphore(hSemaphore,1,NULL);
	}

	return 0;
}

DWORD WINAPI Fun3Proc(LPVOID lpParameter)
{
	while (TRUE)
	{
		DWORD nWaitResult;
		nWaitResult = WaitForSingleObject(hSemaphore,INFINITE);
		if(tickets >0)
			cout<<"Thread3 Sailed ticket "<<tickets--<<endl;
		else
			break;
		ReleaseSemaphore(hSemaphore,1,NULL);
	}
	
	return 0;
}


你可能感兴趣的:(thread,C++,null,fun,winapi)