我想知道如何在运行时安全地更改线程应该等待的 EventWaitHandle 。

例如,假设有两个线程(A 和 C)通过 EventWaitHandles 进行同步。A 循环地执行其工作,C 等待,直到收到 A 的通知,表明它可以开始执行其工作(例如通过自动重置事件)。图案是A-C-A-C...

稍后启动一个新线程 (B)(例如由用户操作)并且它的作业应该以这种方式在两个预先存在的线程之间执行:A 完成工作,然后向 B 发出信号,一旦 B 完成,它向 C 发出信号。现在的模式是 A-B-C-A-B-C...

因此,在线程 C 等待与 A 共享的 EventWaitHandle 之前以及之后,应该有一种安全机制使 C 等待与 B 共享的另一个 EventWaitHandle。在我看来,棘手的部分是替换 C 使用的 EventWaitHandle,因为一旦完成,我应该能够轻松启动 B,它将使用 EventWaitHandle 来等待 A 作业,并使用 EventWaitHandle 来发出 C 作业的信号。该机制还应该提供一种安全卸载线程 B 并返回到只有线程 A 和 C 正在工作的初始状态的方法。

有没有一种安全的方法可以使用 EventWaitHandle 来完成此任务?如果没有,任何其他建议将不胜感激。

有帮助吗?

解决方案

如果任务 A 知道更改,则让任务 C 拥有该事件。如果任务 C 是下一个任务,则任务 A 向任务 C 的事件发出信号;如果任务 B 是下一个任务,则任务 A 向任务 B 的事件发出信号。

或者,使用与更改任何其他共享数据相同的机制:在对句柄的所有访问中获取互斥体。例如任务 C 获取锁、读取句柄、释放锁、等待句柄。要更改它,您需要让 UI 线程获取锁、更改句柄、释放锁。

其他提示

您是否考虑过实现某种调度程序,其中线程可以使用句柄注册(注销)以启动并发出完成信号。然后,调度程序通过设置适当的启动事件来启动下一个线程,并在前一个线程设置完成事件后继续下一个线程。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top