gpt4 book ai didi

c++ - 队列的同步问题

转载 作者:行者123 更新时间:2023-11-30 04:24:42 25 4
gpt4 key购买 nike

我有以下代码来访问 C++ 队列 (responseQueue) 并在进行一些处理后发送响应:

void sendRelpyToClient(){    
if (responseQueue.empty())
return;

static int count = 0;
Result result;

SYNCHRONIZE() { //start of synchronization (pseudo-code)

result = responseQueue.front();
responseQueue.pop();

} //end of synchronization

if(count++ % 9 == 0)
{
//simulate some processing with a sleep
sleep for 15 seconds

}

result.sendResult();
}

responseQueue 包含Result 的实例。 sendResult() 方法可能需要一些处理时间,因此对于存储在队列中的某些结果,该方法可能需要相对较长的时间才能返回。 sendRelpyToClient() 方法被多个线程访问,如果 result.sendResult() 也在 SYNCHRONIZED() block 中,任何其他由于需要很长时间才能返回的 sendResult() 方法,进入的线程可能会被阻塞。这就是我选择这种方法的原因。

对于此实现,我的逻辑是任何访问 responseQueue 的线程都将首先检查队列是否为空并返回。因为任何访问 SYNCHRONIZE() block 的线程都会使队列为空,如果其中只有一个项目,则无需将此检查放在 SYNCHRONIZE() 中堵塞。如果一个正在访问队列的线程在 SYNCHRONIZE() block 之后被(由线程调度程序)关闭,第二个线程将再次获取队列中的下一个项目并调用 result .sendResult(),当第一个线程再次恢复时,它将继续调用 result.sendResult() 并使用线程局部结果值(该线程之前从队列中获得被封锁)。静态计数变量在那里,因此我可以使用 sleep 模拟随机线程的长时间处理,因为正如我上面解释的那样,sendResult() 可能需要很长时间才能进行某些调用。

我用这段代码运行了一组测试,到目前为止一切正常。但我只是想在这里问这个问题,这样我就可以得到你们对此的所有想法,如果这种方法有任何问题。我不是并发编程方面的专家。如果有更好、更高效、更简洁的方法来做到这一点,也许并发不是在队列级别而是在单个数据项级别,请也让我知道。

最佳答案

总的来说,您的方法是正确的,但我要注意两点:

  1. 正如 Xeo 已经提出的,您应该检查同步块(synchronized block)中的队列是否为空。

  2. 您有静态变量 count,它是全局变量,您可以从多个线程读取/写入它而无需同步。这不是那么危险,但可能会导致算法的错误工作。请记住,增量不是原子操作。您可能会遇到 2 个线程同时为计数写入新值的情况。

更新:修复很简单:

    void sendRelpyToClient(){    
static int count = 0;
Result result;

bool execute = false;

SYNCHRONIZE() { //start of synchronization (pseudo-code)
if (responseQueue.empty())
return;
result = responseQueue.front();
responseQueue.pop();

execute = (count++ % 9 == 0);
} //end of synchronization

if (execute)
{
//simulate some processing with a sleep
sleep for 15 seconds
}
result.sendResult();
}

关于c++ - 队列的同步问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12544566/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com