- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我面临以下情况(我不得不承认我太菜鸟了,不相信自己可以单独解决..):我有线程 A,它偶尔会创建新的 cv::Mat 对象供线程 B 使用。我需要一个线程安全的容器 C(在本例中为 boost::circular_buffer),它将保存线程 A 生成的 cv::Mat 对象。然后,线程 B 需要不断地遍历 C 中的所有项目以产生动画。因此,我需要一个线程安全的 C,它将禁止数据竞争,但也会导致线程 B 的动画没有(理想情况下)或非常小(如果不可能的话)滞后 -> 我希望线程 B 在线程 A 更新 C 时卡住。我能想到的最好的是:
#include <boost/circular_buffer.hpp>
#include <opencv2/core.hpp>
#include <boost/core/noncopyable.hpp>
#include <memory>
#include <type_traits>
#include <algorithm>
using im_buf = boost::circular_buffer<cv::Mat>;
class ImageBuffer : private boost::noncopyable {
private:
im_buf buffer;
std::mutex mtx;
std::unique_lock<std::mutex> lock;
public:
// operator<< accepting cv::Mat, cv::Mat& and cv::Mat&&
template <class T,
class = typename std::enable_if
<std::is_same<cv::Mat, typename std::decay<T>::type>
::value>::type>
void operator<<(T&& mat) {
lock.lock();
buffer.push_back(std::forward<T>(mat));
lock.unlock();
}
template <typename Func> // excpect callable objects only
inline void iterate(Func func) {
lock.lock();
std::for_each(buffer.begin(),buffer.end(),func);
lock.unlock();
}
inline ImageBuffer():
buffer {settings::max_images_in_loop},
mtx {},
lock {mtx} {}
~ImageBuffer()=default;
ImageBuffer(const ImageBuffer&&)=delete;
ImageBuffer& operator=(const ImageBuffer&&)=delete;
};
(请注意,即使这不是不变量,线程 B 也不应该改变 C 或其任何内容(我喜欢在这里使用 const_iterator 但 boost::circular_buffer 不提供一个..)
但是,使用此代码,每次线程 A 添加新元素时,线程 B 都会卡住整个动画一段时间。所以,A。没有更好的方法吗??b.实现真的是线程安全的吗?
最佳答案
如果你的问题是动画,那你就担心错了。互斥锁很适合您的目的——不用担心拖延。
理想情况下,您需要以 60fps 的速度生成帧。根据您的应用程序,您可能只需要 20fps。在数字电影出现之前,电影院只能放映 24fps。
60fps 意味着您有 16 毫秒的时间来渲染帧。在 1GHz 处理器上有 1600 万个时钟周期。为了避免由于其他进程造成的卡顿,您需要使用不到一半的周期,比如 4-8 百万个周期,因此 50% 到 75% 的处理器时间是空闲的,并且您只使用 4-8 毫秒的处理器时间来渲染框架。
等待其他线程、互斥锁或其他资源只会在导致您错过下一帧的截止日期时影响您的动画。
如果您的线程必须每隔几帧等待一次,由于互斥锁,需要等待几万个时钟周期,这不会影响您的渲染,因为在下一帧显示之前您还有足够的时间屏幕。
关于c++ - 线程安全、无数据争用、无滞后共享容器 (circular_buffer),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35082124/
我是cpp的新手。我想把“boost::circular_buffer histpos(5);”用 5 个空格将 5 个元素存储在 cpp 结构中作为成员。 我试试这个: typedef struct
我有 2 个进程:一个生产者和“消费者”,它们仍然在缓冲区中保留值,它们将被覆盖。 但是让消费者跟踪会带来一些问题。当缓冲区已满并且值被覆盖时,指向索引 0 的值是刚被覆盖的值之前的值(即下一个最旧的
我需要在处理到达进程 X 的对象之前对它们进行排序。 对象根据时间戳进行排序 - 一个 64 位数字。 当对象超时(几毫)并排序时,进程 X 开始查看它们。 大多数情况下,对象到达时是有序的,有 3%
我正在寻找一个允许在磁盘上获取循环缓冲区的库。 在 Boost 中有类似的东西,但它是一个基于内存的容器:circular_buffer . 最佳答案 你可以随意调用它。 您正在寻找内存映射文件。 使
以下编译失败: auto myCircularBuffer = boost::circular_buffer{1,2,3,4}; 有错误: `error: no matching function f
我在 MAC (xcode) 中使用 boost 库。我有两个关于 boost::circular_buffer 的问题。 1 - 声明 circular_buffer 时出现语法错误 boost::
是否强制存储std::shared_ptr在 boost::circular_buffer 中?如果我有 boost::circular_buffer循环队列delete是第n+1次插入后自动弹出的元
我正在使用 boost 1.73.0,并尝试将循环缓冲区与 manage_mapped_file 一起使用以将字符串存储在磁盘上持久的循环缓冲区中。 我执行以下操作来创建/打开循环缓冲区: boost
我面临以下情况(我不得不承认我太菜鸟了,不相信自己可以单独解决..):我有线程 A,它偶尔会创建新的 cv::Mat 对象供线程 B 使用。我需要一个线程安全的容器 C(在本例中为 boost::ci
阅读rationale , boost::circular_buffer 看起来很有希望: Suitability for real-time and performance critical app
我正在实现 boost::circular_buffer在boost::managed_shared_memory .我使用示例代码演示共享内存中的 vector here .我做了以下更改: 1)
我发现 Boost 实现了 KMP 算法,我想将它与 circular_buffer 一起使用,但我无法将其与组件相匹配。任何有 boost 经验的人都可以告诉我如何做到这一点。 最佳答案 您遇到了什
我想用 unique_ptrs 填充 boost::circular_buffer 但我在公共(public)接口(interface)中的任何函数中找不到任何“emplace”函数或任何 && 参数
我正尝试在我的代码中使用 boost::circular_buffer,如下所示: class EventRegistry { public: EventRegistry() {
我今天早些时候发现,boost::circular 缓冲区的迭代器在多线程环境中的表现并不像我预期的那样。 (尽管公平地说,它们的行为也与我在单线程程序中的想法不同)。 如果您调用 buffer.be
这段简单的代码将 2 个 bool 添加到循环缓冲区。 boost::circular_buffer stuff; stuff.push_back(false); stuff.push_back(tr
我使用 std::vector 编写了很多代码和 std::vector::iterator .现在我决定用 boost 的循环缓冲区替换 vector 容器,即 boost::circular_bu
我是一名优秀的程序员,十分优秀!