2016-06-25 9 views
4

プログラムを1スレッドまで実行しようとすると、しばらくの間(数秒または数分間)正常に動作しますが、フリー(高速停止)エラー。ブーストスレッドを使用したマルチスレッドのセグメンテーションフォルト(コアダンプ)

スレッドが実行する関数は次のとおりです。

 //used in the Function 
[Added] typedef folly::ProducerConsumerQueue<std::string*> PcapTask; 
     struct s_EntryItem { 
     Columns* p_packet; //has some arbitrary method and variables 
     boost::mutex _mtx; 
     }; 
     //_buffersConnection.wait_and_pop() 
     Data wait_and_pop() { 
      boost::mutex::scoped_lock lock(the_mutex); 
      while (the_queue.empty()) { 
       the_condition_variable.wait(lock); 
      } 
      Data popped_value = the_queue.front(); 
      the_queue.pop(); 
      return popped_value; 
     } 
     struct HandlerTask { 
      std::string year; 
      folly::ProducerConsumerQueue<std::string*> queue = NULL; 
     }; 
     ----------------------------------------- 
     //The function which threads run 
      void Connection() { 
       std::string datetime, year; 
       uint32_t srcIPNAT_num, srcIP_num; 
       std::string srcIP_str, srcIPNAT_str, srcIPNAT_str_hex; 
       int counter = 0; 
       while (true) { 
        //get new task 
        HandlerTask* handlerTask = _buffersConnection.wait_and_pop(); 
        PcapTask* pcapTask = handlerTask->queue; 
        year = handlerTask->year;       
        counter = 0; 
        do { 
         pcapTask->popFront(); 
         s_EntryItem* entryItem = searchIPTable(srcIP_num); 

         entryItem->_mtx.lock(); 
         if (entryItem->p_packet == NULL) { 
          Columns* newColumn = new Columns(); 
          newColumn->initConnection(srcIPNAT_str, srcIP_str, datetime, srcIP_num); 
          entryItem->p_packet = newColumn; 
          addToSequanceList(newColumn); 

         } else { 
          bool added = entryItem->p_packet->addPublicAddress(srcIPNAT_str_hex, datetime); 
          if (added == false) { 
           removeFromSequanceList(entryItem->p_packet); 
           _bufferManager->addTask(entryItem->p_packet); 

           Columns* newColumn = new Columns(); 
           newColumn->initConnection(srcIPNAT_str, srcIP_str, datetime, srcIP_num); 
           //add to ip table 
           entryItem->p_packet = newColumn; 
           addToSequanceList(newColumn); 
          } 
         } 
         entryItem->_mtx.unlock(); 
         ++_totalConnectionReceived; 
        } while (true);       
        delete pcapTask; 
        delete handlerTask; 
       } 
      } 
+4

デバッガまたはvalgrindに問い合わせてください。 –

+0

@John Zwinckコードについての考えはありませんか? –

+0

http://kayari.org/cxx/antipatterns.html#locking-mutex –

答えて

4

Valgrindはとても使いやすいです。デバッグ設定でアプリケーションをビルドし、プログラムの実行ファイルをvalgrindに渡します。それは、実行時にあなたのアプリで発生するプログラミングエラーの広い幽霊を伝えることができます。 Valgrindを使用する価格は、Valgrindを使用しない場合よりもかなり遅く(数十倍遅くなる)実行されるということです。具体的には、たとえば、Valgrindは、プログラムのメモリが最初に解放されたときに、そのプログラムのメモリが解放されたときに、そのメモリが解放されたときに、

0

私はそれが問題だとわからないんだけど、...

はあなたがpcapTaskdeleteを呼び出さなければならないということか?

つまり、deleteですが、queuestruct HandlerTaskで、クラスへのポインタではありません。

提案:あなたを見て

は(私はそれを確認し、typedefを追加--- Connection()

--- EDITの終わりに

delete pcapTask; 

行をコメントしよう私が間違っていない場合)あなたのコードには奇妙なことがあります。

pcapTaskfolly::ProducerConsumerQueue<std::string*>ポインタあるPcapTaskポインタとして定義されます。 folly::ProducerConsumerQueue<std::string*>ポインターではありません)

あなたのコードをコンパイルできるのは驚きです。

私はあなたがまずこの異論を解決すべきだと思います。

p.s .:申し訳ありませんが、私の悪い英語です。

+0

残念ながら、私はコードの1行を言及しなかった。これは今質問本体に追加されています。それにもかかわらず、それは問題だと思いますか? –

+0

@ m.r226 - 私は分かりませんが、私はあなたのコードをコンパイルすることができて驚いています:私が間違っていない場合、 'pcapTask'は' PcapTask'ポインタとして定義されています、 'folly :: ProducerConsumerQueue '**ポインタ**;あなたは 'folly :: ProducerConsumerQueue '(** not **ポインタ)で初期化します。 – max66

関連する問題