【问题标题】:Win32 Mutex not waitingWin32互斥锁不等待
【发布时间】:2010-12-07 11:40:30
【问题描述】:

我正在创建一个实现进程间通信的应用程序。 为此,我设置了一个共享缓冲区,它似乎工作正常。 现在,我需要一种数据生成应用程序的方法(用 C++ 编写) 告诉数据接收应用程序(用freepascal/lazarus编写) 什么时候应该读取数据。

我试图为此目的使用互斥锁。我对windows api编程没有太多经验。

所以,我的问题是,在下面的 FreePascal 代码中,互斥锁不会等待。我可以调用 TMutex.Wait() 函数,它不会返回错误或任何东西,但它根本不会等待。

构造函数 TMutex.Create(sName: AnsiString);
开始
sName := 'Local\Mutex'+sName;
hMutex := CreateMutexA(
nil, // 默认访问
True, // 最初不拥有
PChar(sName)); // 命名互斥体
如果 hMutex = 0 那么
开始
raise Exception.Create('mutex 创建失败');
结束;
结束;

析构函数 TMutex.Destroy;
开始
关闭句柄(hMutex);
结束;

程序 TMutex.Wait;
开始
if (WaitForSingleObject(hMutex, INFINITE) 0) then ShowMessage('debug: wait returned something');
结束;

程序 TMutex.Post;
开始
ReleaseMutex(hMutex);
结尾;

【问题讨论】:

  • 命名管道是为此目的而发明的:IPC - 通过共享内存 - 使用方便的基于 ReadFile/WriteFile 的 API

标签: winapi ipc mutex fpc waitforsingleobject


【解决方案1】:

您的问题似乎出在:

    True, // initially not owned

你的东西倒退了——真意味着它最初是拥有的,所以等待它会立即返回。

【讨论】:

  • 真假都试过了,好像没什么区别。我原来是假的,把它改成真的,看看是否改变了任何东西,但没有更新评论。由于它没有改变任何东西,我开始寻找其他地方并忘记了这一点。尽管如此,将 ti 设置回 false 并不会改变任何事情。
【解决方案2】:

您没有向我们展示调用 TMutex 的 Wait 方法的代码。但是,您必须知道互斥锁是可重入的:如果一个线程拥有一个互斥锁,它将始终被授予访问它的权限,因此等待永远不会阻塞。这是内置在互斥锁中以避免死锁。

尝试从另一个线程获取互斥锁,等待应该阻塞。

【讨论】:

  • 好的,现在我得到了使用sharedmem;程序 TIPCThread.test ;开始 ShowMessage('blaat') 结束;程序 TIPCThread.Execute;开始同步(@Test); BlaatSharedMem.Mutex.Wait;同步(@Test);结尾;仍然......我得到了两个 ShowMessages,它们之间没有等待。如您所见,我确实在这里启动了一个新线程,在其中我进行了等待,但没有区别,它根本不等待。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-03-09
  • 2015-07-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多