1、互斥信号同步化对象
HANDLE HMutex =::CreateMutex(//生成互斥信号同步化对象
//防止两个以上的线程同时访问一个共享资源
NULL, //缺省安全属性,使互斥句柄不可继承,CE不支持
线程的同步化,高级别的线程在使用同步化资源时,也需要等待。
1、互斥信号同步化对象
HANDLE HMutex =::CreateMutex(//生成互斥信号同步化对象
//防止两个以上的线程同时访问一个共享资源
NULL, //缺省安全属性,使互斥句柄不可继承,CE不支持
false, //指定互斥信号的初始状态“未被线程拥有”
"forcount"//指定互斥信号名,可以在进程间共享互斥信号同步化对象
) //保存互斥对象句柄
void SharedFunction()
{//使用共享资源count的操作互斥
...
WaitForSingleObject(//根据互斥信号同步化对象的状态决定是否阻塞线程
HMutex, //互斥信号同步化对象
INFINITE); //超时毫秒数,另一线程一直等待互斥信号变为FALSE
if (WaitForSingleObject(pDlg->m_hSynMutex,INFINITE) == WAIT_OBJECT_0)
{++count;
cout<<count<<'\n';
}
ReleaseMutex(HMutex);//释放互斥信号
}
CloseHandle(HMutex);//关闭互斥信号句柄,释放资源,在OnDestroy() 消息函数中被调用,不调用则程序退出系统自动关闭句柄
2、事件对象同步
//创建线程同步事件句柄
HANDLE m_hSynEvent = CreateEvent(NULL,false,true,NULL);//false表调完等待函数后自动设置事件对象成未标识
//true表事件对象已标识
{//以下代码在线程函数中执行
//等待同步事件信号
if (WaitForSingleObject(m_hSynEvent,INFINITE) == WAIT_OBJECT_0){}//事件对象未标识
//打开同步事件信号
SetEvent(m_hSynEvent);//事件对象已标识
}
//关闭线程同步事件对象, 释放资源,在OnDestroy() 消息函数中被调用
CloseHandle(m_hSynEvent);
3、临界区对象同步//只能同步同一进程中的线程
//线程同步临界区对象
CRITICAL_SECTION m_critical_Section;//用保存临界区对象
//typedef struct CRITICAL_SECTION {
// unsigned int LockCount; /* Nesting count on critical section */
// HANDLE OwnerThread; /* Handle of owner thread */
// HANDLE hCrit; /* Handle to this critical section */
// DWORD needtrap; /* Trap in when freeing critical section */
// DWORD dwContentions; /* Count of contentions */
//} CRITICAL_SECTION, *LPCRITICAL_SECTION;
//初始化临界区对象
InitializeCriticalSection(&m_critical_Section);
//进入临界区
EnterCriticalSection(&m_critical_Section);
//离开临界区
LeaveCriticalSection(&m_critical_Section);
//释放临界区对象资源,在OnDestroy() 消息函数中被调用
DeleteCriticalSection(&m_critical_Section);
4、信号量同步//建立在互斥基础上,允许几个线程同时进入要同步的代码。控制资源被同时访问的线程数。
HANDLE m_hSynSemaphore;//信号量同步对象句柄
//创建信号量对象,初始化信号量计数为1,最大信号量计数也为1(第二个1)
m_hSynSemaphore = CreateSemaphore(NULL,1,1,NULL);
//等待信号量可用,当信号量计数大于0时,可用
if (WaitForSingleObject(pDlg->m_hSynSemaphore,INFINITE) == WAIT_OBJECT_0)
//因为等待函数自动给信号量计数减1
//所以给信号量计数加1,使信号量继续可用
ReleaseSemaphore(pDlg->m_hSynSemaphore,1,NULL);
//关闭信号量对象,释放资源,在OnDestroy() 消息函数中被调用
CloseHandle(m_hSynSemaphore);