Wie kann ich einen Mutex in einer Initialisierungsliste sperren?

8

Ich habe eine ConcurrentQueue -Klasse, die auf einem vom Benutzer bereitgestellten Container mit einem Konstruktor wie diesem basiert ...

%Vor%

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?

    
David 24.04.2013, 15:58
quelle

2 Antworten

9
%Vor%

sollte funktionieren.

    
James Kanze 24.04.2013, 16:15
quelle
1

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:

  • Vielleicht ist das Kopieren sowieso keine so gute Idee und Ihr Design funktioniert auch, wenn Sie das Kopieren einfach deaktivieren.
  • Wenn Sie Zugriff auf die Warteschlange haben und sie zum Kopieren lesen können, bedeutet das nicht, dass der Mutex bereits gesperrt sein muss? Wenn nicht, wie sind Sie sicher, dass Sie die Warteschlange wirklich kopieren möchten? Ich bezweifle nicht, dass es Antworten gibt, die das Design rechtfertigen, aber es ist ungewöhnlich.
Ulrich Eckhardt 24.04.2013 16:17
quelle

Tags und Links