2016-06-24 41 views
15

Sto cercando di imparare il C++ 11 filo e avere seguente codice:Perché la funzione add non ha effetto nel thread C++ 11?

#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; 
} 

ho creato un vector che tiene std::thread e chiamare la funzione aggiuntiva di ogni filo e passare i di rif. Dopo quello che ho pensato che il thread avrebbe fatto (l'aggiunta di i = i+1), il risultato finale non riflette quello che volevo.


uscita: i = 0

output previsto: i = 10

+0

@Ajay ma user1887915 era anche wright sul mio mutex creato per ogni thread ... che era una pessima idea. – pokche

risposta

28

Mutex deve essere condivisa tra thread per ottenere il risultato corretto. E i ombreggiato da variabile di loop, sostituirlo con 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 .. .ma ancora ottengo i = 0 .. mi aspettavo 10 – pokche

+2

Modificato, 'i' è ombreggiato da variabile loop ... – user1887915

+3

@pokche, a parte il non-shadowing' i' di un'altra variabile, è anche possibile rendere 'some_mutex' come' statico' nel codice originale. Per me sembra un'opzione più valida quindi passare il 'std :: mutex' ogni volta. – iammilind