【发布时间】:2014-12-25 17:24:20
【问题描述】:
我有一个问题,线程 A 从 curl 回调接收视频数据并将数据添加到 std::deque,而线程 B 从 std::deque 读取数据并进行处理。
我在线程 A 向其添加数据时锁定std::deque,并在线程 B 从中读取数据时锁定它。
一切正常,但几分钟后,我的 curl 回调最终停止,不再接收视频数据。
我假设线程 B 处理数据的时间过长,因此持有锁的时间过长,结果 curl 回调最终停止死亡。
是否有任何可以在 C++ 中使用的队列,在添加和读取时我不必锁定它??
如果需要,我可以发布我的代码。
【问题讨论】:
-
一个简单的方法是将指针推送到双端队列。当您需要处理一个时,只需在弹出指针所需的时间内使用锁。然后在处理数据之前释放锁。 (考虑使用
std::unique_ptr,这样您就不必手动管理内存。) -
或者让读者有自己的
deque,并且只锁定足够长的时间到swap()与共享的空双端队列。交换将比添加或删除项目更快。然后读取器处理其队列副本中的所有内容,清空它,然后再次锁定并与共享的交换它。