3

次のように2つのスレッドを実行しています。コードは iPhone シミュレーターでは完全に機能しますが、デバイスでは機能しません。iPhone (ios 5.1 が実行されている) では、スレッド A が条件を通知しますが、スレッド B は条件を無期限に待機しています。

スレッド A で、データを処理する準備ができたとき:

pthread_mutex_lock(&mutex);
outstandingSig++;
pthread_cond_signal(&condVar);
pthread_mutex_unlock(&mutex);

スレッド B:

 while(1) 
{
  pthread_mutex_lock(&mutex);
  while(outstandingSig == 0)
   {
    pthread_cond_wait(&condVar, &mutex);
   }

  outstandingSig = 0;  //Reset outstanding signals
  pthread_mutex_unlock(&mutex);

 // process data
}

デバイスでの動作が異なる理由について何か提案はありますか? スレッド B がシグナルを消費しない原因は何ですか? また、シミュレーターとデバイスで動作が異なるのはなぜですか?

4

1 に答える 1

0

この問題の根底に到達したか、回避策を見つけましたか? iPhone デバイスで pthread_cond_wait をハングアップさせることで、同様の問題が発生していると思います。

この状態は iOS シミュレーターでは正しく通知されますが、iPhone で実行するとハングします。実行を一時停止してから再開すると、条件が満たされて実行が続行されます。

ただし、プラットフォームによって pthread_cond_wait の実装が異なることに気付きました。

iPhone:

libsystem_c.dylib'pthread_cond_wait

iOS シミュレーター:

libsystem_c.dylib'pthread_cond_wait$UNIX2003

于 2012-07-24T08:29:23.557 に答える