2016-06-24 10 views
15

Ich versuche, die C++ 11-Thread und folgenden Code müssen lernen:Warum hat Add-Funktion keine Auswirkungen in C++ 11 Thread?

#include <iostream> 
#include <thread> 
#include <vector> 
#include <mutex> 
#include <algorithm> 

void add(int& i){ 
    std::mutex some_mutex; 
    // std::cout << " I am " << std::endl; 
    std::lock_guard<std::mutex> guard(some_mutex); 
    i++; 
} 


int main(){ 
    int i = 0; 
    std::vector<std::thread> vec_threads; 

    for(int i = 0; i < 10; i++){ 
     vec_threads.push_back(std::thread(add,std::ref(i))); 
    } 

    std::for_each(vec_threads.begin(),vec_threads.end(), 
      std::mem_fn(&std::thread::join)); 
    std::cout<< " i = " << i << std::endl; 
return 0; 
} 

Ich habe eine vector erstellt, die von jedem Thread std::thread und ich rufe die Add-Funktion hält und übergeben i durch ref. Nach dem, was ich angenommen habe, dass der Thread (das Hinzufügen von i = i+1) tun würde, spiegelt das Endergebnis nicht, was ich wollte.


Ausgang: i = 0

erwartete Ausgabe: i = 10

+0

@Ajay aber user1887915 war auch wright über meine Mutex für jeden Thread erstellt ... was war eine schreckliche Idee. – pokche

Antwort

28

Mutex zwischen Threads gemeinsam genutzt werden muss, das richtige Ergebnis zu bekommen. Und i im Schatten von Loop-Variable, ersetzen Sie es durch j.

#include <iostream> 
#include <thread> 
#include <vector> 
#include <mutex> 
#include <algorithm> 

void add(int& i, std::mutex &some_mutex){ 
    // std::cout << " I am " << std::endl; 
    std::lock_guard<std::mutex> guard(some_mutex); 
    i++; 
} 


int main(){ 
    int i = 0; 
    std::vector<std::thread> vec_threads; 
    std::mutex some_mutex; 

    for(int j = 0; j < 10; j++){ 
     vec_threads.push_back(std::thread(add,std::ref(i), std::ref(some_mutex))); 
    } 

    std::for_each(vec_threads.begin(),vec_threads.end(), 
      std::mem_fn(&std::thread::join)); 
    std::cout<< " i = " << i << std::endl; 
    return 0; 
} 
+0

hmm .. .aber ich bekomme immer noch i = 0 .. wurde erwartet 10 – pokche

+2

Bearbeitet, 'i' wird von Loop-Variable beschattet ... – user1887915

+3

@pokche, abgesehen von un-shadowing' i' durch andere Variable, können Sie auch Machen Sie 'some_mutex' als' static' in Ihrem ursprünglichen Code. Für mich scheint das eine praktikablere Option zu sein, als jedes Mal den 'std :: mutex' zu übergeben. – iammilind

Verwandte Themen