Win32互斥不等

时间:2009-10-16 19:22:49

标签: winapi ipc mutex fpc waitforsingleobject

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

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

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

  

构造函数TMutex.Create(sName:AnsiString);
  开始
  sName:='Local \ Mutex'+ sName;
  hMutex:= CreateMutexA(
  nil,//默认访问
  是的,//最初不是拥有的   PChar类型(SNAME)); //名为mutex
  如果hMutex = 0则为
  开始
  提升Exception.Create('互斥创建失败');
  端;
  端;
  
  析构函数TMutex.Destroy;
  开始
  CloseHandle的(hMutex);
  端;
  
  程序TMutex.Wait;
  开始
  if(WaitForSingleObject(hMutex,INFINITE)<> 0)然后ShowMessage('debug:wait return something');

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

2 个答案:

答案 0 :(得分:2)

看起来您的问题出在:

    True, // initially not owned

你有事情倒退 - 真实意味着它最初是拥有的,所以等待它会立即返回。

答案 1 :(得分:0)

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

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

相关问题