2016-08-19 61 views
-3

我想做一個程序,您可以在其中選擇要執行的線程數,並且遇到問題可以使其運行。我試着先創建線程,然後根據選定的編號加入所有線程,但是當我嘗試加入它們時,程序未檢測到線程。是否可以選擇從程序內部運行的線程數量? C++

//####################### CREATE THREADS ################### 
if (numProcs >= 1) 
{ 
    thread t1(threadTask,repart[0],llargMax,contrassenya); 

} 
if (numProcs >= 2) 
{ 
    thread t2(threadTask,repart[1],llargMax,contrassenya); 

} 
if (numProcs >= 3) 
{ 
    thread t3(threadTask,repart[2],llargMax,contrassenya); 
} 
if (numProcs >= 4) 
{ 
    thread t4(threadTask,repart[4],llargMax,contrassenya); 

} 

//################## JOIN THREADS ################################ 
if (numProcs >= 1) 
{ 
    t1.join(); 
} 
if (numProcs >= 2) 
{ 
    t2.join(); 
} 
if (numProcs >= 3) 
{ 
    t3.join(); 
} 
if (numProcs >= 4) 
{ 
    t4.join(); 
} 

我也嘗試過在創建它之後立即加入每個線程,但是這會停止我的程序並且一次僅加入一個線程。

if (numProcs >= 1) 
{ 
    thread t1(threadTask,repart[0],llargMax,contrassenya); 
    t1.join(); 
} 
if (numProcs >= 2) 
{ 
    thread t2(threadTask,repart[1],llargMax,contrassenya); 
    t2.join(); 
} 
if (numProcs >= 3) 
{ 
    thread t3(threadTask,repart[2],llargMax,contrassenya); 
    t3.join(); 
} 
if (numProcs >= 4) 
{ 
    thread t4(threadTask,repart[4],llargMax,contrassenya); 
    t4.join(); 
} 

最後我試着取下線程,這個工作如果在我的主程序結束時,我等待的時間像樣的數目,所以每一個線程可以在quiting程序之前完成,但我不知道如何檢測所有分離線程何時結束,因此我的程序可以處理更大的線程。

if (numProcs >= 1) 
{ 
    thread t1(threadTask,repart[0],llargMax,contrassenya); 
    t1.detach() 
} 
if (numProcs >= 2) 
{ 
    thread t2(threadTask,repart[1],llargMax,contrassenya); 
    t2.detach(); 
} 
if (numProcs >= 3) 
{ 
    thread t3(threadTask,repart[2],llargMax,contrassenya); 
    t3.detach(); 
} 
if (numProcs >= 4) 
{ 
    thread t4(threadTask,repart[4],llargMax,contrassenya); 
    t4.detach(); 
} 
sleep(100) 

我試過所有這些方法,但現在我卡住了,我不知道我可以試試。任何關於如何做到這一點的想法都會對我有所幫助。

+2

使用*容器*。這個問題與「是否可以選擇在運行時讀取的員工數量」沒有區別。或學生。或動物。 –

+0

也使用*循環*。你需要從0循環到'numProc-1'並且做你想做的一切。 – Sergey

+1

在第一個代碼示例中,您聲明本地作用域中的線程。它甚至如何編譯? – Sergei

回答

0

它不工作,因爲{...}塊定義一個單獨的作用域,以便t1, ...變量沒有他們的存在之外。

而不是使用一些容器,例如,

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

for (int i = 0; i < numProcs; i++) { 
    auto t = std::thread(threadTask, repart[i], llargMax, contrassenya); 
    threads.push_back(std::move(t)); 
} 

// later 

for (auto& t : threads) { 
    t.join(); 
} 
0

我試着先創建線程,然後根據選定的編號加入所有這些線程,但程序在嘗試連接它們時未檢測到線程。

您創建了所有std::thread對象作爲局部變量。在if塊後,他們不見了

將它們存儲在容器中。

我也嘗試過在創建它之後立即加入每個線程,但是這會停止我的程序,並且一次只加入一個線程。

這是什麼意思?你只是依次運行線程入口點。

我不知道如何當所有分離線程已經結束

無法檢測。他們分開。

2

使用容器,如載體。它應該是這樣的:

#include <thread> 
#include <vector> 

int main(int argc, char* argv[]) { 

    size_t num_threads = 123; 

    std::vector<std::thread> vect_threads(num_threads); 
    for (auto& th : vect_threads) { 
    th = std::thread (/*...*/); 
    } 

    // main branch ... stuff...  

    for (auto& th : vect_threads) { 
    if (th.joinable()) { 
     th.join(); 
    } 
    } 

    return 0; 
}