2011-06-07 54 views
1

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

这是一个典型的基于内存的图像循环程序。也就是说,所有用户选择的图像都预先加载到RAM中。我使用地图容器来管理图像序列,以std :: map格式声明,它将Key类型的图像文件名与Data类型的CBitmap指针相关联。我还使用一个vecter字符串(声明如std :: vector)来保存图像文件列表的副本,并按照上述map key列表的顺序排列,以便按顺序编号重复每个图像。这可能没有必要。

关于animaion控制,下面亭样的操作(有的还伴有他们respectve变量声明)被允许:
C++中的多线程线程安全动画建议

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相同的方式进行手动更改,或者在用户定义的滚动归档配置的基础上,一个或多个正在播放的映像过期时自动减少m_dwFrom变量(例如,keep 3天内的图像),同时,应将过期的图像从上述地图和矢量容器中移除。在图像循环的过程中,用户可以随时更改m_dwFPS变量,并且嵌入在主GUI窗口顶部的工具栏中的下拉列表框中。

感谢您花时间阅读我想要做的长篇解释。我希望它可以帮助你回答我以下的问题:

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

我很期待看到您的建议。代码或错误的代码片断,高度赞赏。先谢谢你!

金利

+0

对不起,我会重复我的第二个问题:2。如何使std :: map 和std :: vector 线程安全?仅使用传统的锁,或者更好地与编译器重新排序屏障(例如,_ReadWriteBarrier for Visual C++)和/或CPU重新排序屏障(例如,MemoryBarrier x86和x64 CPU系列)结合使用?
2011-06-07 09:45:20

回答

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时也是可移植的。

+0

谢谢莫卡回复我的Q2。去年我完成了简单的动画项目。但是7X24一年跑了好几次。我的动画库std :: map 可能是导致应用程序停机的最可疑对象。所以,这是我的第二个问题被问到的主要目的。顺便说一句,我用CriticalSection来防止动画帧读/写竞争条件。 – 2011-06-07 11:03:06