- 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/
我是一名优秀的程序员,十分优秀!