微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

locking多个线程

我有一个Win32设备中的C ++程序。 代码的functionX应该阻止其他调用X.这很简单,我可以使用一个互斥体来做到这一点。

但是,函数X创build并启动一个线程Y,它将在X完成后监视事物。 我需要确保X不能再运行,直到Y确信一切正常完成。

据我所知,一个互斥体只能在同一个线程上获取和释放。 我想做的是把互斥锁的'locking'从X移交给Y.

如果以实际发生的事情来描述这个问题比较容易,那么X就是在那里打印一些东西,Y在那里检查打印作业是否完成,而不是纸张用完。 一旦Y满意工作已经完成,并且纸张没有用完,那么可以让X打印其他的东西。 我们希望X尽快完成,以便设备可以继续进行其他工作(通常不涉及打印,因此不应该在打印机完成时暂停)。

DLL的开销

从另一个后台进程的后台脚本pidof

创buildWindows和线程 – C ++

有关NTFS更改日志USNlogging的问题

我怎样才能禁用C#中的Windows键?

所以…有没有一个标准的跨线程locking模式,将做我想做的事情?

我不能使用boost或任何其他第三方库,只能使用Windows内置操作。

closures套接字不释放文件描述符

locking窗口到特定的显示器(winapi)

打印到命令提示符时增加命令提示符的长度

隐式声明“获取

如何在其他计算机上运行Qt 5应用程序(Windows 7)

这是一个足够简单的情况。 所有你需要做的是用一个自动重置事件替换互斥量,最初发送信号。

自动重置事件可以像互斥体一样使用(受一些限制,见下),但可以由任何线程释放:

事件开始信号(“无主”)。

要输入功能X,请等待事件。 只有一个线程将被允许,事件将被自动清除。

函数X启动线程Y,然后退出而不发信号通知事件。

在这一点上,没有线程可以进入函数X,甚至没有进行前一个调用的线程。

当线程Y完成工作时,它表示事件。 这将允许一个线程输入函数X.

互斥对象和事件对象之间有一些区别,你应该知道:

与互斥锁不同,自动重置事件不允许同一个线程进行递归输入。 所以如果函数X自己调用,你需要稍微重新安排一下代码,以便在递归之外获得锁定。

与互斥体不同,如果“拥有”事件的线程意外退出,API不会产生错误。 所以如果Y没有发出信号而退出,应用程序就会陷入僵局。 如果这是一个问题,您将需要自己监视线程Y的状态。 (当然,同样的推理适用于调用X的线程,如果在启动Y之前退出

我会颠倒线程的顺序:

线程Y采取互斥体

线程Y启动线程X来执行打印

线程X打印并返回

线程Y等待其状态并监视打印

线程Y释放互斥锁

这种方式允许你在同一个线程中锁定和释放互斥锁。 另外,您可以更好地分离问题:

X只处理打印,甚至不知道Y.

Y关心同步和正确的打印结束

我把哈里·约翰斯顿的回答标记为接受,因为听起来这样做会很好,似乎是一个很好的通用解决方案。 我甚至可以使用它。

我现在所做的是用两个临界区对象替换单个互斥体,我们称它们为CSx和CSy。 输入X取决于输入CSx。 一旦完成,X也进入CSy。 然后立即离开CSy,这是因为当线程Y启动时,它将在其生命期内进入CSy。 X进入CSy(并立即离开)的唯一原因是因为它知道线程Y不是从以前的调用运行到X.

这与上面的Erik的注释类似,但不是跟踪单个线程句柄,而是允许多个X和Y排队。

这里的风险是线程Y在X离开CSx之前可能不会进入CSy,所以有一个X可以先进入,尽管这个设备的状态和它正在做的事情意味着它不会实际发生。

即使如此,Harry的解决方案也具有单一锁定对象的优点,以及这带来的简单和优雅。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐