我有两个线程;线程 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 中的整个代码发生SuspendThread
的速度比线程 1 中的要快。结果是线程 1 保持挂起状态,直到线程 2 的另一个循环通过。这会导致线程 1 没有处理一条数据(不是很好,但在我的应用程序中可以接受),更严重的是,当停止按钮触发时shouldexit = true
,线程 1 只是无限期地处于挂起模式。
我想到的两种可能的解决方案也行不通: 1 - 放在Thread1_Ready = true;
之后SuspendThread(Thread1_Handle);
(显然,代码Thread1_Ready = true;
永远不会执行) 2 - 将SuspendThread(Thread1_Handle);
线程 1 的行放在线程 2 的开头,就在之前// some other code
,但这会导致延迟哪个线程 1 可以重新进入主循环,这将是非常不可预测的。
这种情况可以用不同的方式解决吗?