2016-06-24 18 views
15

मैं कोड निम्नलिखित C++ 11 धागा जानने के लिए और करने के लिए कोशिश कर रहा हूँ:सी ++ 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; 
} 

मैं एक vector कि std::thread रखती बनाया है और मैं एक धागे से जोड़ने फ़ंक्शन को कॉल करें और रेफरी द्वारा मैं गुजरती हैं। मुझे लगता है कि धागा क्या करेगा (i = i+1 जोड़ने), अंतिम परिणाम मैं जो चाहता था उसे प्रतिबिंबित नहीं करता है।


उत्पादन: मैं = 0

उम्मीद उत्पादन: i = 10

+0

@Ajay लेकिन user1887915 प्रत्येक थ्रेड के लिए मेरे म्यूटेक्स के बारे में भी चिंतित था ... जो भयानक विचार था। – pokche

उत्तर

28

Mutex सही परिणाम प्राप्त करने के लिए धागे के बीच साझा किया जाना चाहिए। और 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

हम्म .. लेकिन मुझे अभी भी i = 0 मिल रहा है .. 10 – pokche

+2

संपादित किया जा रहा था, 'i' को लूप वेरिएबल द्वारा छायांकित किया जा रहा है ... – user1887915

+3

@pokche, अन्य चर द्वारा अन-छाया' i' के अलावा, आप भी कर सकते हैं अपने मूल कोड में 'some_mutex' को' स्थिर 'के रूप में बनाएं। मेरे लिए जो अधिक व्यवहार्य विकल्प लगता है तो हर बार 'std :: mutex' गुजर रहा है। – iammilind

संबंधित मुद्दे