2017-03-07 74 views
-2

我是C++線程的新手。我使用Code:blocks在C++ 11中開發了一個多線程應用程序。線程執行是否在IDE中與C++中的EXE應用程序不同?

應用程序接縫執行和完美工作(程序啓動,將任務分成線程,任務完成後,然後打印信息,然後退出)從代碼塊。

但是,在使用代碼塊生成exe文件後,單獨從命令行運行exe文件後,程序將像以前一樣工作,直到任務完成,但完成所有任務後,線程無法退出並且繼續下一步。

在代碼中運行程序:blocks和outside應該是相同的。我在下面添加了執行線程函數的分割任務函數。我已經使用下面的函數moodycamel::ConcurrentQueue

void divide_task(){ 
    std::atomic<int> doneConsumers(0); 
    std::thread threads[cores_aval]; 
    for (int i = 0; i != cores_aval; ++i) { 
     threads[i] = std::thread([&]() { 
      Item* item = new Read; 
      do{ 
       while (con_read_q.try_dequeue(item)) { 
        //do something with hitem; 
        delete item; 
       } 
      } 
      while (doneConsumers.fetch_add(1, std::memory_order_acq_rel) + 1 == cores_aval); 
     }); 
    } 
} 

更新:感謝您的答覆。我發現代碼塊中的構建選項設置存在問題。發行版分支中的一個編譯器標誌影響了最終的exe文件,通過剝離符號減小了文件大小。

+1

也許你的代碼有缺陷。 [Mcve] –

+0

您的代碼不完整;特別是它似乎缺少'main()'函數和至少一個'#include'。請[編輯]你的代碼,這是你的問題[mcve],然後我們可以嘗試重現並解決它。你還應該閱讀[問]。 –

回答

0

在IDE中運行時,線程之間的時間可能會有所不同,在此之外,與其他環境相比,更容易在一個環境中暴露競態條件。

有/無優化的構建也會改變時間安排並且也可能暴露錯誤。

在任何情況下,如果沒有SSCCE,就不可能說出你的情況有什麼問題,但是我的水晶球說你可能在你的代碼中有數據競爭。

你確定這個while (con_read_q.try_dequeue(item)是線程安全的嗎?

+0

是的,我明白。我沒有比賽條件,因爲我第一次加載所有需要處理的數據,然後處理階段開始。在調用divide_task方法之前,隊列具有所需的所有數據。moodycamel :: ConcurrentQueue具有try_dequeue(item),它是一個線程安全函數。 – Balaram26

相關問題