私はマルチスレッドSYSTERMを開発するためにcygwinの+ Eclispseインディゴ+ CDTを8.0.2を使用する、コードは以下である:pthread_Joinは呼び出し後に戻ることができませんpthread_cancel?
pthread_mutex_t mutexCmd = PTHREAD_MUTEX_INITIALIZER;
pthread_cond_t signalCmd = PTHREAD_COND_INITIALIZER;
void * Func(void * arg)
{
int iStatus;
while (1)
{
int a = 1;
pthread_cleanup_push(pthread_mutex_unlock, &mutexCmd);
pthread_mutex_lock(&mutexCmd);
iStatus = pthread_cond_wait(&signalCmd, &mutexCmd);
if (iStatus) {
err_abort(iStatus, "signalCmd status error");
}
if(arg->Cmd != navi_Go) //Just a command tag;
{
pthread_mutex_unlock(&(pNaviCtrl->mutexCmd));
continue;
}
//do some work
//.....
pthread_mutex_unlock(&mutexCmd);
pthread_cleanup_pop(1);
}
//pthread_detach(pthread_self());
return NULL;
}
int main()
{
int iStatus = 0;
pthread = tid;
iStatus = pthread_create(&tid;NULL, Func, NULL);
if(iStatus)
{
err_abort(iStatus, "Start pthread error");
}
// do some work
...
//Cancel thread
void * retval;
iStatus = pthread_cancel(tid)
iStatus = pthread_join(tid; &retval);
if(iStatus){
err_abort(iStatus,"Stop thread error");
}
return iStatus;
}
プログラムの実行は、それがISTATUS = pthread_joinを(TID1」で停止する場合、& RETVAL ); "もはや先に進むことができなかった、私はスレッドがデッドロックにふらつくかもしれないと思うが、理由を見つけることができません。私はpthread_cancel()を呼び出した後、スレッドが終了してpthread_join()に戻ります。 私のコードに何が間違っているのか教えてください。
「pthread_cleanup_push」と「pthread_cleanup_pop」をすべて削除したときに見つかったのですが、すべてのことはOKですが、理由をkownするのは好きです – user1383457