【发布时间】:2012-05-22 03:52:49
【问题描述】:
我有两个线程;线程 2 为线程 1 提供了必要的数据,并且可以开始处理与线程 1 并行处理的另一块数据,但如果线程 1 较慢(是的,我知道“线程 1读取线程 2 同时写入的内容”,我有两个缓冲区形式的保护,而不是一个)。代码如下:
Thread 1:
while(!shouldexit)
{
// some code
Thread1_Ready = true;
SuspendThread (Thread1_Handle);
}
Thread 2:
while(!shouldexit)
{
while(!Thread1_Ready)
{
// do nothing
}
// some other code
ResumeThread(Thread1_Handle);
}
问题是,有时线程 2 中的整个代码比线程 1 中的SuspendThread 发生得更快。结果是线程 1 保持挂起状态,直到线程 2 的另一个循环通过。这会导致线程 1 没有处理一条数据(不是很好,但在我的应用程序中可以接受),而且更严重的是,当停止按钮触发 shouldexit = true 时,线程 1 只是无限期地处于挂起模式。
我想到的两种可能的解决方案也不起作用:
1 - 将Thread1_Ready = true; 放在SuspendThread(Thread1_Handle); 之后(显然,代码Thread1_Ready = true; 永远不会执行)
2 - 将线程 1 中的 SuspendThread(Thread1_Handle); 行放在线程 2 的开头,就在 // some other code 之前,但这会导致线程 1 重新进入主循环的延迟,这将是非常不可预测的。
这种情况可以用不同的方式解决吗?
【问题讨论】:
-
忙着等待不是解决这个问题的正确方法。了解如何使用正确的同步原语。
标签: multithreading parallel-processing synchronization