我正在创建一个实现进程间通信的应用程序。 为此我设置了一个共享缓冲区,似乎工作正常。 现在,我需要一种数据生成应用程序的方法(用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);
结束;
答案 0 :(得分:2)
看起来您的问题出在:
True, // initially not owned
你有事情倒退 - 真实意味着它最初是拥有的,所以等待它会立即返回。
答案 1 :(得分:0)
您没有向我们展示调用TMutex的Wait,方法的代码。但是,您必须知道互斥锁是可重入的:如果某个线程拥有互斥锁,它将始终被授予对它的访问权限,因此等待将永远不会阻塞。这是内置于互斥锁中以避免死锁。
尝试从另一个线程获取互斥锁,等待应该阻止。