Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ c++;_C++_Multithreading_Thread Safety - Fatal编程技术网

C++ c++;

C++ c++;,c++,multithreading,thread-safety,C++,Multithreading,Thread Safety,我有一个基于计时器的动画程序,计划在工作线程中运行。该程序设计为在启动时始终运行。我还有一个图像制作线程,负责图像处理,然后将每个处理后的图像(JPEG/PNG格式)提供给动画线程,以参与图像循环,而无需用户干预。 这是一个典型的基于内存的图像循环程序。也就是说,所有用户选择的图像都提前加载到RAM中。我使用一个映射容器来管理以std::map格式声明的图像序列,它将Key类型的图像文件名与数据类型的CBitmap指针相关联。我还使用vector字符串(声明为std::vector)以与上述映

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

这是一个典型的基于内存的图像循环程序。也就是说,所有用户选择的图像都提前加载到RAM中。我使用一个映射容器来管理以std::map格式声明的图像序列,它将Key类型的图像文件名与数据类型的CBitmap指针相关联。我还使用vector字符串(声明为std::vector)以与上述映射键列表对应的排序顺序保存图像文件列表的副本,以便按is序列号迭代每个图像。这可能没有必要。

关于animaion控制,允许进行以下类似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_dwFrom变量,同时减少过期的图像应从上述地图和矢量容器中删除。在图像循环过程中,用户可以随时使用嵌入在主GUI窗口顶部工具栏DOAKC中的下拉列表框更改m_dwFPS变量

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

  • 为了使m_dwFrom、m_dwTo、m_dwCurrent和m_dwFPS线程安全,使用InterlocatedExchange或InterlocatedCompareeExchange是否比使用其他锁(如CriticalSection、Mutex等)更高效和更高性能?
  • 如何使std::map和std::vector线程安全?仅使用传统锁,或更好地与编译器重新排序屏障(例如,Visual C++读写载体)和/或CPU重新排序屏障(例如,内存载体x86和x64 CPU系列)结合使用

  • 我期待着看到你的建议。高度赞赏代码或错误代码片段。提前谢谢你


    Golden Lee

    我可能错了,但据我从您的描述中猜测,我会使用传统的锁和互斥锁,使您的共享向量和映射以及其他共享变量线程安全。这是最简单的方法,您的场景听起来并没有那么高的性能,因此无法证明任何更复杂的事情。如果分析显示传统的锁定会成为性能问题,我只会碰上更奇特的东西

    如何使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];
    }
    //...
    };
    
    类myAnimationManager{
    私人:
    标准::映射m_图像映射;
    互斥体mu互斥体;
    公众:
    CBitmap*getImageByName(常量std::string&\u name)
    {
    ScopedLock l(mutex);//锁定图像映射访问
    返回m_imagesmap[_name];
    }
    //...
    };
    

    使用标准锁定原语的好处不仅在于简单,而且在使用boost::thread时还具有可移植性。

    对不起,我要重复我的第二个问题:2。如何使std::map和std::vector线程安全?仅使用传统锁,或更好地与编译器重新排序屏障(例如,Visual C++读写载体)和/或CPU重新排序屏障(例如,内存载体x86和x64 CPU系列)结合使用
    感谢moka对我的第二季度的回复。我去年完成了我的简单动画项目。但它连续一年7X24崩溃了好几次。我的动画库std::map可能是导致应用程序关闭的最可疑的对象。这就是我的第二个问题被问到的主要目的。顺便说一句,我使用CriticalSection来防止动画帧读/写竞争条件。