C++多线程--线程同步--互斥量

1、互斥量

互斥量也是一个内核对象,它用来确保一个线程独占一个资源的访问。互斥量与关键段的行为非常相似,并且互斥量可以用于不同进程中的线程互斥访问资源。

2、互斥量使用

  (1)创建互斥量

         HANDLE CreateM(

         LPSECURITY_ATTRIBUTES lpMutexAttibutes,  //安全控制

         BOOL bInitialOwner,  //初始化的拥有者,谁初始拥有其执行权

         LPCTSTR lpName);

   (2)打开互斥量

          HANDLE OpenMutex(

          DWORD dwDesiredAccess,

          BOOL bInheritHandle,

          LPCTSTR lpName

          );

   (3)等待互斥量

           DWORD WaitForSingleObject(

            HANDLE hHandle,   //互斥量句柄

            DWORD dwMIlliseconds   // time-out interval 等候的超时时间

           );

    (4)释放互斥量

           BOOL ReleaseMutex(

           HANDLE hMutex  //互斥量句柄

            );

3、代码示例

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

using namespace std;

static int number = 10;

HANDLE Mutex1, Mutex2;

DWORD WINAPI ThreadOne(LPVOID lpParameter)
{
	cout << "窗口1售票开始"<< endl;
	while (1)
	{
		WaitForSingleObject(Mutex1, INFINITE);
		if (number > 0)
		{
			cout << "窗口1售出第" << number << "张票" << endl;
			--number;
			Sleep(1000);
		}
		ReleaseMutex(Mutex2);
	}
	return 0;
}

DWORD WINAPI ThreadTwo(LPVOID lpParameter)
{
	cout << "窗口2售票开始" << endl;
	while (1)
	{
		WaitForSingleObject(Mutex2, INFINITE);
		if (number > 0)
		{
			cout << "窗口2售出第" << number << "张票" << endl;
			--number;
			Sleep(1000);
		}
		ReleaseMutex(Mutex1);
	}
	return 0;
}

int main()
{
	HANDLE HOne, HTwo;
	HOne = CreateThread(NULL, 0, ThreadOne, NULL, 0, NULL);
	HTwo = CreateThread(NULL, 0, ThreadTwo, NULL, 0, NULL);

	Mutex1 = CreateMutex(NULL, FALSE, NULL);
	Mutex2 = CreateMutex(NULL, FALSE, NULL);

	CloseHandle(HOne);
	CloseHandle(HTwo);
	while (TRUE)
	{
		if (number == 0)
		{
			cout << "不好意思,票卖完了!" << endl;
			CloseHandle(Mutex1);
			CloseHandle(Mutex2);
			return 0;
		}
		else
		{
			continue;
		}
	}
	system("Pause");
	return 0;
}

猜你喜欢

转载自blog.csdn.net/u012967763/article/details/82843233
今日推荐