我有一个ConcurrentQueue
基于用户提供的容器的类,该容器具有这样的构造函数...
ConcurrentQueue(const ConcurrentQueue& other) : m_Queue(other.m_Queue) {}
但是,我需要other
在复制它时锁定它的互斥锁。
选项1:
所以我根本不能使用复制构造函数,并且做......
ConcurrentQueue(const ConcurrentQueue& other) : m_Queue(other.m_Queue)
{
std::lock_guard<std::mutex> lock(other.m_Mutex);
m_Queue = other.m_Queue;
}
但我不能保证复制分配和复制构造是等效的功能。
选项 2:
我可以有一个私有方法...
std::queue<T, Container> GetQueue() const
{
std::lock_guard<std::mutex> lock(other.m_Mutex);
return m_Queue;
}
然后在构造函数中执行此操作...
ConcurrentQueue(const ConcurrentQueue& other) : m_Queue(other.GetQueue()) {}
但这可能(取决于优化)使用一次 m_Queue 的复制构造函数,它是一次移动构造函数。而且我也不能保证一个副本和一个招式就等于只是一个副本。此外,用户提供的容器可能很奇怪,可以复制但不可移动,这也会导致这种方法出现问题。
那么,我该怎么办?