C++多线程--线程同步信号量

1、信号量

信号量设置一个资源访问计数。当该计数值大于0的时候,该信号量对象为有信号状态,当该计数值等于0的时候,该信号量对象为无信号状态。

2、信号量的使用

  (1)创建信号量

            HANDLE CreateSemaphore(
            LPSECURITY_ATTRIBUTES lpSemaphoreAttributes,//安全属性
            LONG lInitialCount,//初始信号量
            LONG lMaximumCount,//最大信号量
            LPCTSTR lpName //命名
            );

  (2)等待信号量

          WaitForSingleObject
          WaitForMultipleObjects

  (3)释放信号量

           BOOL ReleaseSemaphore(
          HANDLE hSemaphore, //信号量句柄
          LONG lReleaseCount,//释放信号的数量
          LPLONG lpPreviousCount //释放前的数量
         );

  (4)关闭信号量

          CloseHandle

  (5)打开信号量

          OpenSemaphore

3、代码示例

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

using namespace std;

static int number = 10;

HANDLE Sem;

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

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

int main()
{
	HANDLE HOne, HTwo;
	Sem = CreateSemaphore(NULL, 1, 1, NULL);//初始值为1,最大值为1
	HOne = CreateThread(NULL, 0, ThreadOne, NULL, 0, NULL);
	HTwo = CreateThread(NULL, 0, ThreadTwo, NULL, 0, NULL);
	CloseHandle(HOne);
	CloseHandle(HTwo);
	while (TRUE)
	{
		if (number == 0)
		{
			cout << "不好意思,票卖完了!" << endl;
			CloseHandle(Sem);
			return 0;
		}
		else
		{
			continue;
		}
	}
	system("Pause");
	return 0;
}


      

猜你喜欢

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