Mam ConcurrentQueue
klasę, która opiera się na dostarczonych przez użytkownika pojemnik z konstruktora tak ...Jak mogę zablokować muteks na liście inicjalizatora?
ConcurrentQueue(const ConcurrentQueue& other) : m_Queue(other.m_Queue) {}
Ale muszę zablokować other
„s mutex gdy jest on jednocześnie kopiowane.
Wariant 1:
Więc nie mogłem użyć konstruktora kopii w ogóle, a nie ...
ConcurrentQueue(const ConcurrentQueue& other) : m_Queue(other.m_Queue)
{
std::lock_guard<std::mutex> lock(other.m_Mutex);
m_Queue = other.m_Queue;
}
Ale nie mogę zagwarantować, że zadanie kopiowania i skopiuj budowę są równoważne funkcjonalność.
Opcja 2:
mogę mieć prywatną metodę ...
std::queue<T, Container> GetQueue() const
{
std::lock_guard<std::mutex> lock(other.m_Mutex);
return m_Queue;
}
A potem w konstruktorze to zrobić ...
ConcurrentQueue(const ConcurrentQueue& other) : m_Queue(other.GetQueue()) {}
Ale to potencjalnie (w zależności od optymalizacji) używa konstruktora kopiowania m_Queue raz i konstruktora ruchu raz. Nie mogę też zagwarantować, że kopia i ruch są odpowiednikami tylko kopii. Dodatkowo dostarczony przez użytkownika pojemnik może być dziwaczny i podlegać kopiowaniu, ale niemożliwy do zrealizowania, co również powoduje problemy z tym podejściem.
Co mam zrobić?
Czy uważasz, że powinno to zawsze być zrobione w ten sposób? – 0x499602D2
@ 0x499602D2 W rzeczywistości uważam, że należy unikać tej sytuacji. Nie wiem wystarczająco dużo o twoim aktualnym kontekście lub problemie, który próbujesz rozwiązać, by zaproponować alternatywne rozwiązania, ale wiem, że nigdy nie musiałam używać czegoś takiego. W rzeczywistości nie mogę myśleć o przypadku, w którym skopiowałem kontener między wątkami. –