C++/Windows 多线程同步/数据共享

Posted

技术标签:

【中文标题】C++/Windows 多线程同步/数据共享【英文标题】:C++/Windows Multi threaded synchronization/Data Sharing 【发布时间】:2014-07-10 12:13:40 【问题描述】:

我的要求是单帧数据由两种方法并行处理(它们需要并行,因为它们对计算的要求很高)。

根据其中一个线程的结果,需要停止另一个线程。 也就是说,如果方法 1 首先返回 TRUE,则方法 2 应该停止。 如果方法 1 先返回 FALSE,则方法 2 不应停止。

同样,如果方法 2 首先返回 TRUE,则方法 1 应该停止。 如果方法 2 先返回 FALSE,则方法 1 不应停止。

请注意,方法 1 和方法 2 是库调用(黑盒),我无权访问它们的内部。我所知道的是它们的计算量很大。 如何在 C++/Windows 中实现它?有什么建议么?

【问题讨论】:

【参考方案1】:

看看并发运行时。 特别是 task 命名空间 (http://msdn.microsoft.com/en-us/library/dd492427.aspx) 和 when_any 函数 (http://msdn.microsoft.com/en-us/library/hh749973.aspx)。concurrency::when_any 将创建一个当任何输入任务完成时完成的任务。

【讨论】:

【参考方案2】:

无论您使用plain Windows threads、std::thread、Task Parallelism 还是您喜欢的任何库,鉴于您在问题中提供的详细信息,您仍然无法实现您想要的。

虽然您当然可以确定第一个线程/任务何时完成(例如 @j-w 的回答),但如果不告诉您的“黑盒库函数”,您就无法真正停止另一个任务优雅停止(除非它提供了显式提前取消的方法)。您没有指出可以告诉黑盒功能中途取消,所以我假设它不是。

您不能简单地终止线程/任务,因为这会造成资源泄漏,甚至可能造成其他令人讨厌的东西,例如解除锁定等,具体取决于您的黑盒函数的作用。

因此,您可以使用 when_any 或其他同步/信号原语之类的东西,即使您不需要结果,也可以让其他线程/任务继续运行,“取消黑盒”您的库函数并添加取消支持,或者完全忘记它。

【讨论】:

以上是关于C++/Windows 多线程同步/数据共享的主要内容,如果未能解决你的问题,请参考以下文章

多线程编程-----线程同步

多线程同步与并发访问共享资源工具—LockMonitorMutexSemaphore

多线程线程同步

二多线程深入理解

多线程编程之Windows同步方式

Java多线程之线程同步