1、线程同步
线程同步是指线程之间所具有的一种制约关系,一个线程的执行依赖另一个线程的消息,当它没有得到另一个线程的消息时应等待,直到消息到达时才被唤醒。
3、线程同步的方法
(1)临界区
(2)信号量
(3)互斥量
(4)事件
4、临界区
(1)临界区的作用,线程在执行代码时,将代码锁定,不允许其他线程执行,只有该线程离开后,其他线程才能使用这些代码;
(2)临界区的使用
1)初始化临界区
扫描二维码关注公众号,回复:
3695689 查看本文章
VOID InitializeCriticalSection(LPCRITICAL_SECTION lpCriticalSection);
2) 临界区加锁
VOID EnterCriticalSection(LPCRITICAL_SECTION lpCriticalSection);
3)临界区解锁
VOID LeaveCriticalSection(LPCRITICAL_SECTION lpCriticalSection);
4) 释放临界区
VOID DeleteCriticalSection(LPCRITICAL_SECTION lpCriticalSection);
5、代码示例
#include <iostream>
#include <Windows.h>
using namespace std;
static int number = 10;
CRITICAL_SECTION CriticalSection;
DWORD WINAPI ThreadOne(LPVOID lpParameter)
{
cout << "窗口1售票开始"<< endl;
while (1)
{
EnterCriticalSection(&CriticalSection);
if (number > 0)
{
cout << "窗口1售出第" << number << "张票" << endl;
--number;
Sleep(1000);
}
LeaveCriticalSection(&CriticalSection);
}
return 0;
}
DWORD WINAPI ThreadTwo(LPVOID lpParameter)
{
cout << "窗口2售票开始" << endl;
while (1)
{
EnterCriticalSection(&CriticalSection);
if (number > 0)
{
cout << "窗口2售出第" << number << "张票" << endl;
--number;
Sleep(1000);
}
LeaveCriticalSection(&CriticalSection);
}
return 0;
}
int main()
{
HANDLE HOne, HTwo;
InitializeCriticalSection(&CriticalSection);
HOne = CreateThread(NULL, 0, ThreadOne, NULL, 0, NULL);
HTwo = CreateThread(NULL, 0, ThreadTwo, NULL, 0, NULL);
while (TRUE)
{
if (number == 0)
{
cout << "不好意思,票卖完了!" << endl;;
DeleteCriticalSection(&CriticalSection);
return 0;
}
else
{
continue;
}
}
system("Pause");
return 0;
}