您可以使用互斥体对象来保护共享资源免受多个线程或进程的同时访问。每个线程必须等待互斥体的所有权,才能执行访问共享资源的代码。例如,如果多个线程共享对数据库的访问,线程可以使用互斥对象一次只允许一个线程写入数据库。
在以下示例中,进程使用CreateMutex函数创建一个命名的互斥对象或打开现有互斥对象的句柄。
HANDLE hMutex;
//创建一个没有初始所有者的互斥体。
hMutex = CreateMutex(
NULL, //没有安全属性
FALSE, //最初不拥有
"MutexToProtectDatabase"); //互斥体名称
if (hMutex == NULL)
{
//检查错误。
}
当此过程的线程写入数据库时??,如下一个示例中,它首先请求互斥体的所有权。如果它获得所有权,线程将写入数据库,然后释放其所有权。
该示例使用尝试 - 最后结构化异常处理语法来确保线程正确释放互斥体对象。无论尝试块如何终止,最后代码块都被执行(除非尝试块包含对TerminateThread函数的调用)。这样就可以防止mutex对象被无意中丢弃。
BOOL FunctionToWriteToDatabase(HANDLE hMutex)
{
DWORD dwWaitResult;
//请求互斥体的所有权。
dwWaitResult = WaitForSingleObject(
hMutex, //互斥体的句柄
5000L); //五秒超时间隔
switch(dwWaitResult)
{
//线程具有互斥量所有权。
case WAIT_OBJECT_0:
尝试{
//写入数据库。
}
最后{
//释放互斥体对象的所有权。
if(!ReleaseMutex(hMutex)){
//处理错误。
}
break;
}
//由于超时,无法获取互斥锁。
case WAIT_TIMEOUT:
return FALSE;
//获得已放弃的互斥体对象的所有权。
case WAIT_ABANDONED:
return FALSE;
}
return TRUE;
}