2017-03-24 68 views
1

我有下面的代碼作爲我的主要功能:如何讓功能同時運行多次?

int main(int argc,char** argv) 
{ 
    CommandLineParser cmd(argc,argv,keys); 
    if (cmd.has("help")) { 
     cmd.about(""); 
     cmd.printMessage(); 
     return 0; 
    } 
    String alphaFile = cmd.get<String>("alpha"); 
    String betaFile = cmd.get<String>("beta"); 
    String gammaFile = cmd.get<String>("gamma"); 
    String deltaFile = cmd.get<String>("delta"); 
    int featureToUse = cmd.get<int>("feature"); 
    int classifier = cmd.get<int>("classifier"); 

    runOnSingleCamera(alphaFile, featureToUse, classifier); 
    runOnSingleCamera(betaFile, featureToUse, classifier); 
    runOnSingleCamera(gammaFile, featureToUse, classifier); 
    runOnSingleCamera(deltaFile, featureToUse, classifier); 

    return 0; 
} 

runOnSingleCamera是我的其他功能之一,而且每個調用運行在不同的視頻文件同樣的事情。代碼需要在所有視頻文件上同時運行並訪問相同的全局陣列。

這樣做的最好方法是什麼?

如果解決方案是多線程,請告訴我應該包含在我的cmake文件中,因爲我已經嘗試過,但無法使其工作。

+1

請參閱'std :: thread'的示例http://en.cppreference.com/w/cpp/thread/thread/thread –

回答

2

如何:

int main(int argc,char** argv) 
{ 
    CommandLineParser cmd(argc,argv,keys); 
    if (cmd.has("help")) { 
     cmd.about(""); 
     cmd.printMessage(); 
     return 0; 
    } 
    String alphaFile = cmd.get<String>("alpha"); 
    String betaFile = cmd.get<String>("beta"); 
    String gammaFile = cmd.get<String>("gamma"); 
    String deltaFile = cmd.get<String>("delta"); 
    int featureToUse = cmd.get<int>("feature"); 
    int classifier = cmd.get<int>("classifier"); 

    std::thread t1(runOnSingleCamera, alphaFile, featureToUse, classifier); 
    std::thread t2(runOnSingleCamera, betaFile, featureToUse, classifier); 
    std::thread t3(runOnSingleCamera, gammaFile, featureToUse, classifier); 
    std::thread t4(runOnSingleCamera, deltaFile, featureToUse, classifier); 

    t1.join(); 
    t2.join(); 
    t3.join(); 
    t4.join(); 

    return 0; 
} 

多線程是雖然不是玩具。如果在這裏一切都是獨立的,那麼這是好的。如果變量以某種方式相互依賴,則必須小心。

如果你的數組是隻讀的,那麼這是OK的。如果你的數組需要被所有線程修改,那麼這是一個銷燬配方。再一次,真的要小心線程間的共享變量。這是一個非常大的話題。閱讀關於race-conditions

請注意,這一切都是通過價值傳遞;即,所有內容都被複制到您的函數中(即使您的函數通過引用獲取內容)。您應該使用std::ref()來傳遞參考。閱讀更多關於std::thread here

+0

這就是我所說的當我說我無法獲得多線程工作,不清楚的道歉,我得到以下錯誤: – TomRobson

+0

/usr/bin/ld:CMakeFiles/main.dir/main.cpp.o:未定義的引用符號'pthread_create @@ GLIBC_2.2.5' // lib /x86_64-linux-gnu/libpthread.so.0:添加符號時出錯:命令行中缺少DSO collect2:錯誤:ld返回1退出狀態 CMakeFiles/main.dir/build.make:163:recipe for target'main '失敗 make [2]:*** [main]錯誤1 CMakeFiles/Makefile2:67:目標'CMakeFiles/main.dir/all'的配方失敗 [1]:*** [CMakeFiles/main.dir/all]錯誤2 Makefile:83:目標'all'的配方失敗 make:*** [all]錯誤2 – TomRobson

+0

@TomRobson您必須鏈接到pthread 。鏈接使用標誌'-pthread'。你可以在cmake中使用'target_link_libraries'來達到這個目的。例如'target_link_libraries(MyExec -pthread)'。用cmake中的對象替換MyExec。 –