2016-06-24 9 views
15

Я пытаюсь выучить C++ 11 нити и имеет следующий код:Почему добавление функции не влияет на поток 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; 
} 

Я создал vectorstd::thread, который держит и я вызываю функцию надстройки из каждого потока и передать I по иому. После того, что я предположил, что поток будет делать (добавление i = i+1), конечный результат не отражает то, что я хотел.


выхода: я = 0

ожидается выход: I = 10

+0

@Ajay, но user1887915 также был связан с моим мьютексом, созданным для каждой темы ... что было ужасной идеей. – pokche

ответ

28

Мьютекса должен быть разделен между потоками, чтобы получить правильный результат. И i затеняет переменная цикла, замените ее на 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 ... Но я все еще получаю i = 0 .. ожидал 10 – pokche

+2

Отредактировано, 'i' затеняется переменными цикла ... – user1887915

+3

@pokche, кроме того, что вы не затеняете' i' другой переменной, вы также можете make 'some_mutex' как' static' в вашем исходном коде. Для меня это кажется более жизнеспособным вариантом, чем передача 'std :: mutex' каждый раз. – iammilind

 Смежные вопросы

  • Нет связанных вопросов^_^