我阅读了一些关于Mutex的文档,但我唯一的想法是它有助于阻止线程访问已被其他资源使用的资源。
我从Code片段获得并执行了正常工作:
#include <windows.h>
#include <process.h>
#include <iostream>
using namespace std;
BOOL FunctionToWriteToDatabase(HANDLE hMutex)
{
DWORD dwWaitResult;
// Request ownership of mutex.
dwWaitResult = WaitForSingleObject(
hMutex, // handle to mutex
5000L); // five-second time-out interval
switch (dwWaitResult)
{
// The thread got mutex ownership.
case WAIT_OBJECT_0:
__try
{
// Write to the database.
}
__finally {
// Release ownership of the mutex object.
if (! ReleaseMutex(hMutex)) {
// Deal with error.
}
break;
}
// Cannot get mutex ownership due to time-out.
case WAIT_TIMEOUT:
return FALSE;
// Got ownership of the abandoned mutex object.
case WAIT_ABANDONED:
return FALSE;
}
return TRUE;
}
void main()
{
HANDLE hMutex;
hMutex=CreateMutex(NULL,FALSE,"MutexExample");
if (hMutex == NULL)
{
printf("CreateMutex error: %d\n", GetLastError() );
}
else if ( GetLastError() == ERROR_ALREADY_EXISTS )
printf("CreateMutex opened existing mutex\n");
else
printf("CreateMutex created new mutex\n");
}
但我不明白的是线程在哪里以及共享资源在哪里?任何人都可以解释或提供更好的文章或文件吗?
答案 0 :(得分:11)
互斥锁提供 mut ually ex 对资源的群集访问权限;在你的情况下,一个数据库。程序中没有多个线程,但您可以运行多个程序实例,这是您的互斥锁正在防范的。实际上,它仍然可以防止来自多个线程的访问,只是这些线程可以位于不同的进程中。
您的代码正在创建一个名为的互斥锁,可以在应用程序的多个实例之间共享。这是进程间通信的一种形式。 CreateMutex
上的MSDN文档提供了有关命名互斥锁的其他有用信息:
可以调用两个或多个进程 CreateMutex创建相同的命名 互斥。实际上是第一个过程 创建互斥锁,然后创建互斥锁 进程足够的进程 权利只是打开一个句柄 现有的互斥...
多个进程可以拥有句柄 相同的互斥对象,可以使用 进程间对象 同步。
只有当您正在使用的数据库本身不支持多线程访问时,才需要使用互斥锁。
答案 1 :(得分:0)
也许这将是你的最佳来源
答案 2 :(得分:0)
msdn中的这个link提供了与main()函数中的线程类似的示例。但是,不再包括应该是数据库的共享资源 无论如何,共享资源是需要从多个线程访问的任何内容:settingsfiles,drivers,database,...
请注意,示例中的计数器是在受互斥锁保护的情况下写入的,而在未受保护时已被读取。虽然在这种情况下,可能没有问题,但有点草率。
答案 3 :(得分:-1)
您可以参考此SO帖子以比较各种线程同步机制 Difference between Locks, Mutex and Critical Sections
如果您需要特定信息Mutex,那么维基百科将为您提供足够的详细信息。