1

整数ポインターを引数として受け入れる関数があり、それを変更します。別のスレッドで実行されている関数のインスタンスがいくつかあります-引数と同じ整数を持つものもあります。

引数が別のスレッドの関数の別のインスタンスによって変更されている場合は、関数のインスタンスを一時停止し、他のインスタンスが変数の変更を完了したときに再開する必要があります。

この種の問題に対する一見明白な解決策は NSLock または POSIX ミューテックスですが、これにより、整数の引数が異なっていても、関数のすべてのインスタンスが続行できなくなります。

私が何を意味するかをより直感的に理解するには、次のことを考慮してください。

void theFunction (int *argument)
{   
    NSLock *theLock = [NSLock new];
    [theLock lock];

    (*argument) ++;

    [theLock unlock];
}

上記のコードでは、関数のすべてのインスタンスが実行されなくなりますが、整数引数が同じである関数のインスタンスを一時停止するだけで済みます。ロックが解除されるまで変数を読み書きしようとしているインスタンスを一時停止するように、変数を具体的にロックするにはどうすればよいですか?

4

2 に答える 2

1

int* がある場合は、アトミック インクリメント操作の使用を検討してください (OSAtomicAdd32 の man を参照)。必要な値ごとのロックはかなり安価です。

于 2012-08-09T20:24:36.710 に答える
0

引数ごとに個別のロックを使用しますか?

于 2012-08-09T22:22:08.913 に答える