2

私は pthread の中にいるコードのブロックを持っており (このスレッドを呼び出すことができますa)、新しい pthread を生成したいと考えています (このスレッドを呼び出すことができますb)。スレッドbに両端キューを渡す必要があり、次のコードがあります。

void* process_thread_b(void* arg)
{              
  deque<string> *ptr = (deque<string>*)arg;
  cout << "Size -" << ptr->size() << endl;

  deque<string>::iterator it;
  for(it = ptr->begin(); it != ptr->end(); it++)
  {
    cout <<(*it) << endl;
  }
}

上記のコードはスレッドb'sコードです。両端キューが渡され、サイズが正しく出力されます。その要素のいずれかを印刷しようとすると、次のようになります。

terminate called after throwing an instance of 'std::bad_alloc'
 what():  std::bad_alloc
Abort (core dumped)

pthread を生成するときは、以下のコードを使用します...

 deque<string> myDeque;

 // Add strings to deque here...

 pthread_t dispatchCommands;
 pthread_create(&dispatchCommands, NULL, &process_thread_b, (void*)&myDeque);

一番下のコードはスレッドで実行されますa。両端キューの要素を出力しようとすると、エラーが発生するのにサイズを取得できるのはなぜですか?

4

2 に答える 2

5

pthread_createスレッド関数が実行を開始するずっと前に戻ります。あなたのdeque意志はずっと前に破壊されました。ヒープ上に作成する必要があります。

于 2012-04-30T22:54:03.620 に答える
1

デッキへの参照を void* にキャストしようとしていることが原因だと思います。これを試してください。

 deque<string> * myDeque = new deque<string>();

次に -> を使用してその機能にアクセスします。

次に、myDeque を void ポインターに直接キャストすると、初期化されたままになります。

すなわち。:

 (void*)myDeque

お役に立てれば。

于 2012-04-30T22:52:40.330 に答える