1

我正在开发一个本质上是单线程的程序,它唯一的线程是主事件循环线程。因此,它的所有数据结构基本上都不受临界区之类的保护。

在它最近集成了一些基于 DirectShow API 的新功能之前,一切都很好。一些 DirectShow API 打开第二个事件循环,并在第二个循环内调度消息(即,不可预测地调用其他事件处理回调)。因此,当调用第二个事件处理函数时,它可能会损坏调用 DirectShow API 的函数正在访问的数据结构。

我在内核编程方面有一些经验。我想到的是,对于一个单线程程序,它应该如何处理它的数据结构就像内核应该如何处理 per-CPU 数据结构一样。在内核中,当一个函数访问每个 CPU 的数据时,它必须禁用中断(非常类似于第二个事件循环中的消息调度)。但是,我发现没有简单的方法可以避免调用 DirectShow API 或防止在其中创建第二个事件循环,有什么办法吗?

4

2 回答 2

1

互斥体。信号量。锁定。无论你想叫它什么名字,这就是你所需要的。

于 2009-05-14T18:16:21.637 回答
0

有几种可能的解决方案浮现在脑海中,具体取决于问题所在和您的代码:

  1. 在调用任何运行模态循环的 API 之前,请确保您的数据结构处于一致状态。
  2. 如果这不可能,您可以使用一个简单的布尔变量来保护结构。如果已设置,则只需中止任何更新尝试或将更新排队以备后用。另一种选择是中止先前的操作。
  3. 如果问题是用户生成的事件,则在操作进行时禁用有问题的菜单或按钮。或者,您可以显示一个模式对话框。
于 2009-06-04T20:13:05.560 回答