2017-07-24 1 views
8

In dem folgenden Code, wenn ich a1 nicht freigeben, scheint der Code in einer Endlosschleife innerhalb der map.find-Funktion stecken.Warum kann ich nicht zwei Accessoren für dasselbe Element in der tbb-Hash-Map haben?

Was ist, wenn ich nach einem Element in zwei verschiedenen Teilen der Anwendung suchen muss?

#include <iostream> 
#include "tbb/concurrent_hash_map.h" 

using namespace std; 
using namespace tbb; 

void main() 
{ 
    concurrent_hash_map<int, int> map; 

    concurrent_hash_map<int, int>::accessor a1, a2; 

    map.insert(make_pair(1, 111)); 

    cout << "a1 - " << map.find(a1, 1) << endl; 

    //a1.release(); 

    cout << "a2 - " << map.find(a2, 1) << endl; 
} 

Antwort

8

Ein Accessor ermöglicht Schreibzugriff. Dies bedeutet, dass eine Schreibsperre erworben wird und von nicht mehr als einem einzelnen Accessor gehalten wird. Sie geben einen Deadlock ein, weil derselbe Thread versucht, dasselbe Element zum Schreiben über verschiedene Accessoren zu sperren.

Wenn alles, was Sie wollen, ist die Daten lesen, dann eine const_accessor mit find verwenden. Es wird nur eine Lesesperre erhalten. Mehrere Lesesperren können ohne Deadlocking erfasst und gehalten werden.

concurrent_hash_map<int, int>::const_accessor a1, a2; 
+0

Vielen Dank! – Jack

+0

Ist es möglich, einen const_accessor und einen Accessor gleichzeitig zu haben? – Jack

+1

@Jack - Nein. Ein Schreibvorgang muss ausgeführt werden, wenn niemand liest, um die Lesedaten nicht zu beschädigen. Es kann also keine Lesesperre erhalten werden, während eine Schreibsperre vorliegt, und umgekehrt. In einem einzelnen Thread werden Sie erneut blockieren, wenn beide Accessoren versuchen, die Daten zu erfassen, ohne sie zu veröffentlichen. Die Idee bei allen Accessoren ist, sie in kleinen Blöcken zu verwenden, damit sie nicht länger als nötig am Schloss "hängen bleiben". Konstanten sind nur eine Optimierung für den Fall, in dem Synchronisation nicht erforderlich ist (jeder liest nur, und schreibt nicht). – StoryTeller

Verwandte Themen