gpt4 book ai didi

c++ - 有人可以解释 Mutex 及其使用方法吗?

转载 作者:可可西里 更新时间:2023-11-01 13:21:20 27 4
gpt4 key购买 nike

我阅读了一些关于 Mutex 的文档,但我得到的唯一想法仍然是它有助于防止线程访问已被另一个资源使用的资源。

我从代码片段中获取并执行,效果很好:

#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");

}

但是我不明白的是线程在哪里,共享资源在哪里?谁能解释一下或提供更好的文章或文档?

最佳答案

互斥体提供对资源的相互排他访问;在你的情况下,一个数据库。您的程序中没有多个线程,但是您可以运行多个程序实例,这是您的互斥锁所要防止的。实际上,它仍然防止来自多个线程的访问,只是这些线程可以在不同的进程中。

您的代码正在创建一个已命名 互斥锁,它可以在您的应用程序的多个实例之间共享。这是进程间通信的一种形式。关于 CreateMutex 的 MSDN 文档有关于命名互斥锁的额外有用信息:

Two or more processes can call CreateMutex to create the same named mutex. The first process actually creates the mutex, and subsequent processes with sufficient access rights simply open a handle to the existing mutex...

Multiple processes can have handles of the same mutex object, enabling use of the object for interprocess synchronization.

只有当您使用的数据库本身不支持多线程访问时,这里才需要互斥体。

关于c++ - 有人可以解释 Mutex 及其使用方法吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3528877/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com