关键部分对象可以存储在std :: vector中吗?

时间:2019-06-10 22:20:31

标签: winapi move stdvector critical-section

根据the documentation,关键部分对象无法复制或移动。

这是否意味着它不能作为实例安全地存储在std::vector样式集中?

1 个答案:

答案 0 :(得分:1)

正确; CRITICAL_SECTION对象不应被复制/移动,因为它可能会停止工作(例如,可能包含指向其自身的指针)。

一种方法是存储智能指针的向量,例如(C ++ 17代码):

#include <windows.h>
#include <memory>
#include <vector>

using CS_ptr = std::unique_ptr<CRITICAL_SECTION, decltype(&DeleteCriticalSection)>;

CS_ptr make_CriticalSection(void)
{
    CS_ptr p(new CRITICAL_SECTION, DeleteCriticalSection);
    InitializeCriticalSection(p.get());
    return p;
}

int main()
{
    std::vector<CS_ptr> vec;
    vec.push_back( make_CriticalSection() );    
}

考虑使用std::recursive_mutex(它是CRITICAL SECTION的直接替代)(可能只是将其包装在Windows实现中),并在其析构函数中执行正确的初始化和释放。

标准互斥锁也是不可复制的,因此,在这种情况下,如果要使用向量互斥锁,则可以使用std::unique_ptr<std::recursive_mutex>

As discussed here还要考虑您是否真正想要std::mutex而不是递归互斥体。

注意:Windows Mutex是一个进程间对象; std::mutex和朋友对应一个CRITICAL_SECTION


我还建议重新考虑对互斥量向量的需求;对于您想做的任何事情,可能会有更好的解决方案。