2017-03-07 6 views
-2

私はC++スレッディングの初心者です。私はCode:blocksを使ってC++ 11でマルチスレッドアプリケーションを開発しました。スレッド実行はIDE内でもC++でのexeアプリケーションとも異なりますか?

コードブロックからアプリケーションの継ぎ目が完全に実行され(プログラムの開始、タスクのスレッドへの分割、タスクの完了時に情報の印刷と終了が行われます)、終了します。

しかし、コードブロックを使用してexeファイルを生成し、コマンドラインからexeファイルを別々に実行すると、プログラムは以前と同じように動作しますが、すべてのタスクが完了するとスレッドは終了せず、次のステップに進んでください。

コード内でプログラムを実行する:ブロックと外部は同じである必要があります。私はスレッド関数を実行する以下の分割タスク関数を追加しました。私は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); 
     }); 
    } 
} 

更新:は、回答いただきありがとうございます。コードブロックにビルドオプション設定の問題が見つかりました。リリースブランチのコンパイラフラグの1つが、最終的なexeファイルに影響を与え、シンボルの削除によってファイルサイズが縮小されました。

+1

おそらくコードに不具合があります。 [Mcve] –

+0

あなたのコードは不完全です。特に、main()関数と少なくとも1つの '#include'が欠落しているようです。コードを問題の[mcve]にするようにコードを編集してください。そうすれば、それを再現して解決することができます。 [ask]も読んでください。 –

答えて

0

IDEで実行するとスレッド間のタイミングが異なる可能性があります。このタイミングは、競合条件が他の環境と競合する可能性があります。

最適化を使用する/使用しないビルドでもタイミングが変更され、バグも公開される可能性があります。

いずれにしても、SSCCEがないと、あなたのケースで何が間違っていると言うことはできませんが、私のクリスタルボールはあなたのコードにデータ競争があると言います。

このwhile (con_read_q.try_dequeue(item)はスレッドセーフですか?

+0

はい、わかりました。私は最初に処理する必要があるすべてのデータをロードし、処理段階が始まるので、競合状態はありません。キューにはdivide_taskメソッドが呼び出される前に必要なすべてのデータがあります。moodycamel :: ConcurrentQueueにはスレッドセーフな関数であるtry_dequeue(item)があります。 – Balaram26

関連する問題