2016-03-23 20 views
-4

Merhaba C++ & konuları okuyorum. C++ 'da yeni yaşıyorum ve aşağıdaki kod diğer dillerdeki deneyimime dayanıyor. Ancak bana rağmen her şey yolunda görünüyor ve ben derlediğim zaman, onu çalıştırdığımda, kilitleniyor - hiçbir şey yapmıyor. Bana neyi yanlış yaptığımı söyler misiniz?C++ basit iş parçacıkları örnek

#include <iostream> 
#include <thread> 
#include <vector> 
#include <string> 

void printLine(std::string str) { 
    std::cout << str << std::endl; 
} 

void child(int id) {  
    printLine("This is a thread with id: " + std::to_string(id)); 
} 

int main() { 

    printLine("This is the main thread and we are baout to spawn threads...");  
    std::vector<std::thread> threads; 

    for (int i = 0; i < 10; i++) { 

     threads[i] = std::thread(child, i);   
     threads[i].join(); 

    } 

    printLine("Press any key to exit..."); 
    std::getchar(); 

    return 0; 

} 
+0

sınırları erişimi dışında bu kadar tanımsız davranış: 'ipler [i] = std :: thread (çocuk, ı) ; '. "Thread" vektörü boş. – juanchopanza

+0

Neden onları bir for döngüsünün dışında kullanmıyorsanız bir vektöre "ekliyorsunuz"? – Default

+0

Aşağı oylama yapmak ve bunun aptalca bir soru olduğunu düşünmek için, en azından aşağı-oylama yerine hatamla ilgili bir başvuruda bulunabiliyorsanız bunu takdir ediyorum. – Syd

cevap

0

bazı ipler çalışan almaya çalışırken Kodunuz burada değil sorun, bu test durumu ile konusu olmasıdır:

std::vector<std::thread> threads; 

for (int i = 0; i < 10; i++) { 

    threads[i] = std::thread(child, i);   
    threads[i].join(); 

} 

threads böylece for döngü girme threads[0] veya> 0 erişen üzerine boş Tanımsız Davranışa yol açar.

Sen cidden bu vector öğeler eklemek yerine push_back (veya emplace_back) kullanmalıdır:

std::vector<std::thread> threads; 

for (int i = 0; i < 10; i++) { 

    threads.push_back(std::thread(child, i));   
    threads[i].join(); 
} 
+0

Döngüye katılmak için biraz anlamsız. – juanchopanza

+0

@Juanchopanza Doğru, kodun gerçek anlamından ziyade UB'ye neden olan parçaya odaklanmaya çalıştım. –

İlgili konular