C++ 在互斥锁解锁时从定时接收解锁

C++ 在互斥锁解锁时从定时接收解锁,c++,c,multithreading,synchronization,posix,C++,C,Multithreading,Synchronization,Posix,我有一个线程,它尝试使用定时接收函数从消息队列中读取内容。线程还有一个互斥体,它作为需要退出(例如,应用程序已关闭)的指示器:最初,互斥体被锁定,当它被解锁(在其他地方)时,线程需要停止 我希望以这样一种方式执行定时接收,即当互斥锁解锁时,它也会解锁。因此,当我们被要求停止时,我们会立即停止,而无需等待定时接收超时 在Windows中,我可以通过重叠IO和WaitForMultipleObjects()实现这一点。命名管道上的重叠读取返回一个对象,然后我同时等待该对象和互斥对象 在POSIX中有

我有一个线程,它尝试使用定时接收函数从消息队列中读取内容。线程还有一个互斥体,它作为需要退出(例如,应用程序已关闭)的指示器:最初,互斥体被锁定,当它被解锁(在其他地方)时,线程需要停止

我希望以这样一种方式执行定时接收,即当互斥锁解锁时,它也会解锁。因此,当我们被要求停止时,我们会立即停止,而无需等待定时接收超时

在Windows中,我可以通过重叠IO和WaitForMultipleObjects()实现这一点。命名管道上的重叠读取返回一个对象,然后我同时等待该对象和互斥对象


在POSIX中有什么方法可以做到这一点吗?

有很多方法。可能最简单的方法是使用一个布尔值,该值在线程停止时设置为
true
。使用互斥锁保护布尔值,并让线程定期检查它


更好的解决方案是使用原子布尔。最有可能的情况是,您使用的是一个拥有它们的平台,或者是从C++-11,作为编译器内部函数,或者是其他方式。

您能不能向队列发送一些消息来唤醒线程,让它注意到一些“终止”布尔值?在非平凡操作系统中,如果线程在应用程序终止之前不需要关闭,则不应该明确地终止它,除非有一个超越的要求。C++ MARTIN是可以实际工作的。C不是C++不是C!选择一种语言。@Olaf什么?这适用于任何一方。请您自己提供信息。C语言和C++语言是不同的语言。如果C++中C代码的代码为1,则不意味着语义相同,2)编码风格非常糟糕。另一方面也是如此。如果有人告诉你不同的语言,他显然至少对其中一种语言不太了解。如果只有一个编写器和多个读卡器,互斥锁应该是不必要的。@Ctx POSIX有一个定义,即当一个线程正在或可能在另一个线程中访问某个内存位置时,该内存位置不能在一个线程中修改。所以你肯定需要一个互斥体或者某种形式的原子操作。我的问题不是如何定期检查互斥体,而是如何在互斥体解锁后立即退出定时接收,即使这发生在超时之前。假设您有一个超时1小时的定时接收。5分钟的互斥解锁。我希望定时接收在发生这种情况后立即返回,而不是等待剩余的55分钟。@DavidSchwartz不适用于bool等原子数据类型。原子数据类型只是用来启用无锁的programming@IvanMolodetskikh这取决于你收到了什么样的礼物。例如,如果它在TCP连接上,请使用
shutdown
使
read
中止。或者,您可能希望减少超时时间,检查bool,然后重试以更快地关闭。它非常特定于具体的用例。