Ich habe eine ConcurrentQueue
-Klasse, die auf einem vom Benutzer bereitgestellten Container mit einem Konstruktor wie diesem basiert ...
Aber ich muss den Mutex von other
während des Kopiervorgangs sperren.
Option 1:
Also konnte ich den Kopierkonstruktor überhaupt nicht verwenden und mache ...
%Vor%Aber ich kann nicht garantieren, dass die Kopierzuweisung und die Kopierkonstruktion gleichwertige Funktionen sind.
Option 2:
Ich könnte eine private Methode haben ...
%Vor%Und dann im Konstruktor das tun ...
%Vor%Aber das verwendet (abhängig von Optimierungen) möglicherweise einmal den Kopierkonstruktor von m_Queue und einmal den Konstruktor move. Und ich kann auch nicht garantieren, dass eine Kopie und ein Umzug nur einer Kopie entspricht. Zusätzlich könnte der vom Benutzer bereitgestellte Container bizarr und kopierbar aber unbeweglich sein, was ebenfalls zu Problemen führen würde.
Also, was mache ich?
Sperren Sie, erstellen Sie eine Kopie des Inhalts und tauschen Sie sie dann mit dem Mitglied aus. Zumindest ist das der einfachste und IMHO sauberste Weg. Eine andere, weniger saubere Methode ist die Verwendung des Komma-Operators: (a, b)
rendies b
, aber wenn a
eine Bereichssperre ist, wird das temporäre bis zum nächsten Sequenzpunkt leben, dh bis Sie b
verwendet haben, um Ihre zu initialisieren lokale Kopie.
Das heißt, es gibt zwei Dinge zu beachten:
Tags und Links c++ multithreading c++11