前一篇学习了临界区的概念,但是没有线程控制力。在这里我加入了通知事件来进行线程同步控制的目的。
1. 创建Win32控制台应用程序
2. 加入以下代码
/*Thread.cpp*/
#include<stdio.h>
#include<process.h>
#include <Windows.h>
//线程临界区锁
class CCriticalSectionLock
{
public:
CCriticalSectionLock() { InitializeCriticalSection(&m_cs); }
~CCriticalSectionLock() { DeleteCriticalSection(&m_cs); }
void Lock() { EnterCriticalSection(&m_cs); }
void Unlock() { LeaveCriticalSection(&m_cs); }
private:
CRITICAL_SECTION m_cs;
};
//增加值及锁
int g_AddValue = 0;
CCriticalSectionLock g_lockAddValue;
//主线程退出状态及锁
bool g_MainThreadExit = false;
CCriticalSectionLock g_lockMainTreadExit;
//值增加事件
HANDLE g_hOnValueAddedEvent;
//主线程退出事件
HANDLE g_hMainThreadExitEvent;
//主控制线程
void ThreadMain(void *arg)
{
for(int i = 0; i<20; i++)
{
//主线程中增加值
g_lockAddValue.Lock();
g_AddValue ++;
printf("g_AddValue在主线程中是: %d\n", g_AddValue);
g_lockAddValue.Unlock();
//发布值增加事件
SetEvent(g_hOnValueAddedEvent);
}
//设置主线程退出状态
g_lockMainTreadExit.Lock();
g_MainThreadExit = true;
g_lockMainTreadExit.Unlock();
SetEvent(g_hOnValueAddedEvent);
_endthread();
}
//工作线程1
void ThreadWorker1(void *arg)
{
while(true)
{
//响应值增加事件
WaitForSingleObject(g_hOnValueAddedEvent, INFINITE);
g_lockAddValue.Lock();
g_AddValue ++;
printf("工作线程1: %d\n", g_AddValue);
g_lockAddValue.Unlock();
//事件响应完成
ResetEvent(g_hOnValueAddedEvent);
//检查状态
g_lockMainTreadExit.Lock();
bool bAppExit = g_MainThreadExit;
g_lockMainTreadExit.Unlock();
if(bAppExit)
break;
}
//发布值增加事件
SetEvent(g_hMainThreadExitEvent);
_endthread();
}
//程序入口
void main()
{
//初始化事件和关键段 自动置位,初始无触发的匿名事件
g_hOnValueAddedEvent = CreateEvent(NULL, FALSE, FALSE, NULL);
g_hMainThreadExitEvent = CreateEvent(NULL, FALSE, FALSE, NULL);
//开始线程
_beginthread(ThreadMain,0,NULL);
_beginthread(ThreadWorker1,0,NULL);
//等待主线程退出
WaitForSingleObject(g_hMainThreadExitEvent, INFINITE);
ResetEvent(g_hMainThreadExitEvent);
}
注意:需要将 项目属性 -> 配置属性 -> C/C++ -> 代码生成 -> 运行时库 属性设置为多线程调试(多线程)