0

我正在创建一个实现进程间通信的应用程序。为此,我设置了一个共享缓冲区,它似乎工作正常。现在,我需要一种方法让数据生成应用程序(用 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('互斥体创建失败');
  结尾;
结尾;

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

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

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

4

2 回答 2

2

看起来您的问题出在:

    True, // initially not owned

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

于 2009-10-16T19:26:04.627 回答
0

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

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

于 2009-11-04T06:01:26.133 回答