临界区对象可以存储在std::vector中吗?
Can a critical section object be stored in a std::vector?
根据the documentation,无法复制或移动临界区对象。
这是否意味着它不能作为实例安全地存储在 std::vector
样式集合中?
正确; CRITICAL_SECTION
对象不应该是 copied/moved,因为它可能会停止工作(例如,它可能包含指向自身的指针)。
一种方法是存储智能指针向量,例如(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 的 drop-in 替代品(可能只是将其包装在 Windows 实现中),并在其析构函数中执行正确的初始化和释放.
标准互斥锁也是 non-copyable,所以对于这种情况,如果您想要它们的向量,您可以使用 std::unique_ptr<std::recursive_mutex>
。
As discussed here 还要考虑您是否真的想要 std::mutex
而不是递归互斥。
注意:Windows Mutex
是一个 inter-process 对象; std::mutex
和好友对应一个CRITICAL_SECTION
.
我还建议重新考虑对互斥向量的需求;无论您尝试做什么,都可能有更好的解决方案。
根据the documentation,无法复制或移动临界区对象。
这是否意味着它不能作为实例安全地存储在 std::vector
样式集合中?
正确; CRITICAL_SECTION
对象不应该是 copied/moved,因为它可能会停止工作(例如,它可能包含指向自身的指针)。
一种方法是存储智能指针向量,例如(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 的 drop-in 替代品(可能只是将其包装在 Windows 实现中),并在其析构函数中执行正确的初始化和释放.
标准互斥锁也是 non-copyable,所以对于这种情况,如果您想要它们的向量,您可以使用 std::unique_ptr<std::recursive_mutex>
。
As discussed here 还要考虑您是否真的想要 std::mutex
而不是递归互斥。
注意:Windows Mutex
是一个 inter-process 对象; std::mutex
和好友对应一个CRITICAL_SECTION
.
我还建议重新考虑对互斥向量的需求;无论您尝试做什么,都可能有更好的解决方案。