0

NSThread を使用して新しいスレッドを作成し、それから thread_funtion を実行しています。スレッドをキャンセルしたいので、[スレッド キャンセル] を使用しますが、スレッドは続行します。

NSThread *thread=[[NSThread alloc] initWithTarget:self selector:@selector(thread_funtion) object:nil];
[thread start];

-(void)thread_funtion
{
     //my code
}

thread_funtion でフラグを使用してその実行を制御することは知っていますが、便利な場合もありますが、複雑すぎます。

-(void)thread_funtion
{
      if(flag)
    {
        //some code
    }
    if(flag)
    {
        //some code
    }
}

質問 1: スレッドをすぐにキャンセルするにはどうすればよいですか?</p>

次に、別の方法を使用して新しいスレッドを作成します。

pthread_t id;
int ret;
ret=pthread_create(&id,NULL,thread_function,NULL);
if(ret!=0){
    printf ("Create pthread error!\n");
    exit (1);
}

次に、pthread_cancel(id) を使用すると、スレッドはすぐに停止します。しかし、thread_function では:

void* thread_function(void *arg)
{
    //This is not a function of the class, So I can't use self.somobject !
}

質問は、Cコードではなく、クラスのオブジェクトをどのように使用するかです。

4

1 に答える 1

3

NSThreadキャンセルは、 を呼び出すことで検出できるスレッドにフラグを設定するだけisCancelledです。スレッドが続行を意図している場合、スレッドは停止しません。

そして、これは実際には良いことです。マルチスレッドでの私の長い経験から、私は、広告は自分自身の寿命を含め、自分自身を完全に制御するべきだと考えています。

スレッドがリソースをロックしている場合、または重要な構造の更新の途中でスレッドを強制終了することはお勧めできません。

定期的にスレッド関数を呼び出して動作するように、スレッド関数を再構築することをお勧めしますisCancelled。正しく行うと、特定のポイントでチェックする、ループ内でチェックする、ブロッキング呼び出しにタイムアウトまたはブロックを解除する方法があることを確認するなどして、キャンセルへの応答の最大レイテンシを保証できます。

于 2012-10-16T03:09:17.110 に答える