c ++中的多线程线程安全动画建议

时间:2011-06-07 08:28:30

标签: c++ multithreading thread-safety

我有一个基于计时器的动画程序,计划在工作线程中运行。该程序旨在启动时始终以运行方式运行。我还有一个图像生成线程,负责图像处理,然后将每个处理过的图像(JPEG / PNG格式)提供给动画线程,以参与图像循环而无需用户干预。

这是一个典型的基于内存的图像循环程序。也就是说,所有用户选择的图像都预先加载到RAM中。我使用地图容器来管理图像序列,以std :: map格式声明,它将Key类型的图像文件名与Data类型的CBitmap指针相关联。我还使用vecter字符串(声明为std :: vector)以对应于上述映射键列表的排序顺序保存图像文件列表的副本,以便按顺序编号迭代每个图像。这可能没有必要
关于动画控制,允许以下类似于kiosk的操作(一些伴随着他们尊重的变量声明):

bool m_bPlay;   // Play forward
bool m_bPause; // Pause animation
bool m_bStop;  // Stop animation
bool m_bReverse; // Play backward
bool m_bRepeat; // Repeated play when reaching to last image
DWORD m_dwFrom;  // Starting image number
DWORD m_dwTo;    // Ending image number
DWORD m_dwCurrent;  // Current image number
DWORD m_dwFPS;   // Frames per second


其中m_dwTo变量可由用户通过使用嵌入在主GUI窗口顶部的工具栏中嵌入的旋转按钮来更改,或者每次将新处理的图像添加到上述地图中时由应用程序自动更改以及矢量容器。类似地,m_dwFrom变量也可以以与m_dwTo相同的方式手动更改,或者在根据用户定义的滚动归档配置过期一个或多个正在播放的图像到期时由应用程序自动减少(例如,保持3天内的图像),同时,应从上述地图和矢量容器中删除过期图像。用户可以在图像循环过程中随时更改m_dwFPS变量,其中下拉列表框嵌入在主GUI窗口顶部的工具栏中。

感谢您抽出宝贵时间阅读我想要做的详细解释。我希望它可以帮助您回答以下问题:

  1. 为了使m_dwFrom,m_dwTo,m_dwCurrent和m_dwFPS线程安全,使用InterlockedExchange或InterlockedCompareExchange比使用CriticalSection,Mutex等其他锁更有效,性能更高吗?
  2. 如何使std :: map和std :: vector线程安全?仅使用传统锁,或者更好地结合编译器重新排序屏障(例如,_ReadWriteBarrier forVisual C ++)和/或CPU重新排序屏障(例如,MemoryBarrier x86和x64 CPU系列)?

  3. 我期待看到你的建议。我们非常感谢代码或虚假代码段。提前谢谢!

    金利郎

1 个答案:

答案 0 :(得分:0)

我可能错了,但就我可以从你的描述中猜测,我会使用传统的锁和互斥锁来制作你的共享矢量和地图,以及你的其他共享变量线程安全。它只是最直接的方式,你的场景并没有真正发挥性能密集,以证明任何更复杂的东西。如果剖析显示传统锁定成为性能问题,我只会触及任何更奇特的东西!

如何使std :: map和std :: vector线程安全?

这样做的常见方法是在您需要访问的容器函数周围编写一个锁定包装器。例如:

class myAnimationManager{
private:
std::map<std::string, CBitmap*> m_imagesMap;
Mutex m_mutex;

public:
CBitmap * getImageByName(const std::string & _name)
{
ScopedLock l(m_mutex); //lock image map access
return m_imagesMaps[_name];
}
//...
};

保持标准锁定原语的好处不仅在于使用boost :: thread时的简单性和便携性。