0

我有两个线程;线程 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 可以重新进入主循环,这将是非常不可预测的。

这种情况可以用不同的方式解决吗?

4

1 回答 1

2

你有一个经典的生产者-消费者问题。标准(并且在 99% 的情况下足够)解决方案是互斥保护队列。在您的情况下,队列大小为 1,但队列语义仍然适用。

这将解决您的问题,因为示例运行如下所示:

Thread 1: Lock queue, see that queue is empty, wait for queue full signal
Thread 2: Produce data
Thread 2: Lock queue, push data into queue (has now size 1), Unlock queue and wake up Thread 1
Thread 2: Produce data
Thread 2: Lock queue, see that queue is full, wait for queue space signal
Thread 1: Wakes up, gets data, sends queue space signal
于 2012-05-21T19:46:10.130 回答