待っているpthreadを殺す方法

条件変数を待っている間に眠るpthreadを持つ。私はそれを実行し続けるために外側whileループでブール値を使用します。私が持っているように見える問題は、スレッドが死んでいないこの変数を変更するときです。

私は楽器を見て、スレッドを開始したら、それを命じてから、新しいスレッドを開始してください。スレッド数は2ではなく1です。

どうしたらこのスレッドを適切に破棄できますか?

int worktodo=0;
BOOL runthread=NO;
pthread_cond_t cond=PTHREAD_COND_INITIALIZER;
pthread_mutex_t mutex=PTHREAD_MUTEX_INITIALIZER;


void *threadfunc(void *parm)

{
    int rc;


    while(runthread==YES)

    {
        rc=pthread_mutex_lock(&mutex);

        while(!worktodo)

        {
            printf("thtread blocked\n");
            rc=pthread_cond_wait(&cond, &mutex);

        }

        printf("thtread awake.... doing work\n");

       //doing work

        worktodo=0;

        rc=pthread_mutex_unlock(&mutex);



    }

   //never reaches here!!
    pthread_detach(NULL);


}



void makeThread()
{

pthread_attr_t  attr;

int             returnVal;

returnVal = pthread_attr_init(&attr);
assert(!returnVal);
runthread=YES;
returnVal = pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);
assert(!returnVal);

int     threadError = pthread_create(&str->thread, &attr, &threadfunc, NULL);

returnVal = pthread_attr_destroy(&attr);
assert(!returnVal);
if (threadError != 0)
{
   //Report an error.
}



}

void wakethread()
{

    pthread_mutex_lock(&mutex);

    worktodo=1;
    pthread_cond_signal(&cond);

    pthread_mutex_unlock(&mutex);

}

void killthread

{
  runthread=NO;

}
0

2 答え

thitonは正しい。それがブロックされている間、私はスレッドを殺すことができませんでした。 Theresはおそらくこれを行う良い方法ですが、私のために働く解決策は、スレッドをfalseに設定してからスレッドを起動させることでした。

void killthread

{
  runthread=NO;

  pthread_mutex_lock(&mutex);

    worktodo=1;
    pthread_cond_signal(&cond);

    pthread_mutex_unlock(&mutex);


}
1
追加された

runthreadをNOに初期化し、YESと比較します。スレッドは決して内部に到達すべきではありません

while(runthread==YES)

ループ。また、スレッドが作業を待つとき、killthreadは起動せず、ランスレッドは作業待ちループに留まります。

0
追加された
私は私の答えを固定し、私はランスドッグを外していた。私は具体的には、私は待っているスレッドを殺す方法を知る必要があると思う
追加された 著者 dubbeat,