【发布时间】:2018-05-01 10:24:01
【问题描述】:
我有一个阻塞队列(我很难改变它的实现),我想测试它是否真的阻塞了。特别是,如果队列为空,pop 方法必须阻塞,并在执行 push 时立即解除阻塞。请参阅以下伪 C++11 代码进行测试:
BlockingQueue queue; // empty queue
thread pushThread([]
{
sleep(large_delay);
queue.push();
});
queue.pop();
显然并不完美,因为有可能会发生整个线程pushThread在调用pop之前就已经执行完毕,即使延迟很大,而且延迟越大我要等待的时间越多测试结束。
如何正确确保在调用push 之前执行pop 并且在push 返回之前一直阻塞?
【问题讨论】:
-
通常你不能在标准c++中,因为对于其他线程来说,阻塞线程看起来与调度程序休眠的线程相同。实际上,等待 50ms 左右就足够了。
标签: c++ multithreading unit-testing c++11 blocking