Win32 互斥体不等待
我正在创建一个实现进程间通信的应用程序。 为此,我设置了一个共享缓冲区,看起来效果很好。 现在,我需要一种数据生成应用程序的方法(用 C++ 编写) 告诉数据接收应用程序(用 freepascal/lazarus 编写) 什么时候应该读取数据。
我试图使用互斥体来达到此目的。我对 windows api 编程没有太多经验。
所以,我的问题是,在下面的 FreePascal 代码中,互斥体不会等待。我可以调用 TMutex.Wait() 函数,它不会返回错误或任何内容,但它根本不会等待。
构造函数 TMutex.Create(sName: AnsiString);
开始
sName := 'Local\Mutex'+sName;
hMutex := CreateMutexA(
nil, // 默认访问
True, // 最初不拥有
PChar(sName)); // 命名互斥体
如果 hMutex = 0 则
开始
引发 Exception.Create('互斥体创建失败');
结束;
结束;
析构函数 TMutex.Destroy;
开始
CloseHandle(hMutex);
结束;
过程 TMutex.Wait;
开始
if (WaitForSingleObject(hMutex, INFINITE) <> 0) then ShowMessage('调试:等待返回某些内容');
结束;
过程 TMutex.Post;
开始
ReleaseMutex(hMutex);
结尾;
I am creating an application that implements inter process communication.
For this purpose I have set up a shared buffer, which seems to work fine.
Now, I need a way for the data generating application (written in c++)
to tell the data receiving application (written in freepascal/lazarus)
when it should read the data.
I was trying to use a mutex for this purpose. I do not have much experience with windows api programming.
So, my problem is, in the FreePascal code below, the mutex won't wait. I can call the TMutex.Wait() function, it doesn't return an error or anything, but it simply won't wait.
constructor TMutex.Create(sName: AnsiString);
begin
sName := 'Local\Mutex'+sName;
hMutex := CreateMutexA(
nil, // default access
True, // initially not owned
PChar(sName)); // named mutex
if hMutex = 0 then
begin
raise Exception.Create('mutex creation failed');
end;
end;destructor TMutex.Destroy;
begin
CloseHandle(hMutex);
end;procedure TMutex.Wait;
begin
if (WaitForSingleObject(hMutex, INFINITE) <> 0) then ShowMessage('debug: wait returned something');
end;procedure TMutex.Post;
begin
ReleaseMutex(hMutex);
end;
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
看起来你的问题在于:
你的东西是倒退的——true意味着它最初是被拥有的,所以等待它会立即返回。
It looks like your problem is at:
You have things backwards -- true means it initially IS owned, so waiting on it will return immediately.
您没有向我们展示调用 TMutex 的 Wait 方法的代码。但是,您必须知道互斥锁是可重入的:如果线程拥有互斥锁,则它将始终被授予对其的访问权限,因此等待永远不会阻塞。这是内置于互斥体中以避免死锁的。
尝试从另一个线程获取互斥体,等待应该阻塞。
you don't show us the code that calls the Wait, method of TMutex. however, you have to know that a mutex is reentrant: if a thread owns a mutex, it will always be granted access to it, thus a wait will never block. this is built into the mutex to avoid deadlocks.
try acquiring the mutex from another thread, the wait should block.