我有以下代码可以访问 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()
块中,则任何其他进入的线程都可能因sendResult()
方法返回时间长而被阻塞。这就是我选择这种方法的原因。
我对此实现的逻辑是任何访问 responseQueue 的线程都将首先检查队列是否为空并返回。由于任何访问该块的线程SYNCHRONIZE()
都会在队列中只有一个项目时使队列为空,因此无需将此检查放在SYNCHRONIZE()
块内。如果正在访问队列的一个线程在SYNCHRONIZE()
块之后立即被取消(由线程调度程序),则第二个线程再次将获取队列中的下一项并调用,当第一个线程再次恢复时,result.sendResult()
它将继续调用result.sendResult()
result 的线程本地值(该线程在被阻塞之前从队列中获得)。静态计数变量在那里,以便我可以使用睡眠模拟随机线程的长时间处理,因为正如我在上面解释的那样sendResult()
某些呼叫可能需要很长时间。
我用这段代码运行了一组测试,到目前为止一切正常。但是我只是想在这里问这个问题,以便如果这种方法有任何问题,我可以得到你们的所有想法。我不是并发编程方面的专家。如果有更好、更高效、更干净的方法来做到这一点,也许不是在队列级别而是在单个数据项级别的并发,请也让我知道。