2016-07-22 10 views
0

Ich habe einen ganz einfachen Code, in dem mehrere Threads versuchen, Daten in std :: map einfügen und nach meinem Verständnis sollte dies führte Absturz zu programmieren, da diese Daten Rennen istStd :: Karte Thread sicher in C++ 11 einfügen?

std::map<long long,long long> k1map; 
void Ktask() 
{ 
    for(int i=0;i<1000;i++) 
    { 
     long long random_variable = (std::rand())%1000; 
     std::cout << "Thread ID -> " << std::this_thread::get_id() << " with looping index " << i << std::endl; 
     k1map.insert(std::make_pair(random_variable, random_variable)); 
    } 
} 


int main() 
{ 
    std::srand((int)std::time(0)); // use current time as seed for random generator 
    for (int i = 0; i < 1000; ++i) 
    { 
      std::thread t(Ktask); 
      std::cout << "Thread created " << t.get_id() << std::endl; 
      t.detach(); 
    } 

    return 0; 
} 

i lief es jedoch mehrere Zeit und es gibt keinen Anwendungsabsturz und wenn derselbe Code mit pthread und C++ 03 ausgeführt wird, stürzt die Anwendung ab, also frage ich mich, ob es eine Änderung in C++ 11 gibt, die Map Insert Thread sicher macht?

+0

Wenn Ihr Code nicht * nachweisbar * threadsicher ist, dann sollten Sie nicht davon ausgehen, dass dies der Fall ist. Sie sollten nicht davon ausgehen, dass etwas in Bezug auf Threading ist in Ordnung, nur weil das Programm nicht abstürzte. –

+0

Ja, ich verstehe das, aber Problem ist ähnlich Code, den wir in der Produktionsumgebung verwenden, stürzt ab und der Code stürzt ab, wo Map interne Struktur neu ausbalanciert ist, also nur wissen wollen, gibt es irgendeine Änderung in C++ 11 für Map Insert Thread Sicherheit weil da benutzen wir C++ 03 mit phreads – Kapil

Antwort

1

Nein, std::map::insert ist nicht threadsicher.

Es gibt viele Gründe, warum Ihr Beispiel nicht abstürzt. Ihre Threads werden möglicherweise aufgrund des Systemplaners seriell ausgeführt oder weil sie sehr schnell abgeschlossen werden (1000 Iterationen sind nicht so häufig). Ihre Karte wird sich schnell füllen (nur mit 1000 Knoten) und daher werden spätere Einfügungen die Struktur nicht wirklich verändern und die Möglichkeit von Abstürzen reduzieren. Oder die Implementierung, die Sie verwenden, ist Thread-sicher.

0

Für die meisten Standardbibliothekstypen besteht die einzige Garantie für die Threadsicherheit darin, dass separate Objektinstanzen in separaten Threads verwendet werden können. Das ist es.

Und std::map ist keine der Ausnahmen zu dieser Regel. Eine Implementierung könnte Ihnen mehr Sicherheit bieten, oder Sie könnten einfach Glück haben.

Und wenn es darum geht Threading Bugs zu beheben, gibt es nur eine Art von Glück.