ロックしようとしたときに1つのCPUを使用せず、別の場所でロックされているカカオのロックが必要です。カーネルスケジューラに実装されているもの。
4 に答える
スピンロックではないロックを見つけようとしているようです。すべてのロックは何らかの CPU を使用する必要があり、そうしないと機能しません。:-)
NSLock は Cocoa で最も明白です。シンプルな -lock, -unlock インターフェイスを持ち、その実装で pthread ミューテックスを使用します。NSRecursiveLock、NSCondition、NSDistributedLock など、より具体的なニーズに対応するために、Cocoa にはより洗練されたロックが多数あります。
さらに使いやすい @synchronized ディレクティブもありますが、追加のオーバーヘッドがあります。
そのようなものを探している場合、GCDにはカウントされたセマフォオブジェクトもあります。
ロックの代わりに、NSOperations と NSOperationQueue を使用し-setMaxConcurrentOperationCount:
て共有リソースにアクセスすることをお勧めします。単一幅の操作キューを使用することで、一度に 1 つのことだけがリソースを使用することを保証できますが、複数のスレッドがそうすることができます。
これにより、ロックの必要がなくなり、すべてがユーザー空間で行われるため、パフォーマンスが大幅に向上します。私は、共有リソースに関するほとんどすべてのロックをこの手法に置き換えましたが、その結果には非常に満足しています。
カーネルロックが本当に必要で、何をしているのかを知っている場合は、次を使用できます
<libkern/OSAtomic.h>
常に「バリア」バリアントを使用してください。これらは posix ロックよりも高速で、はるかに危険です。新しいコードで 10.6 をターゲットにできる場合は、GCD が最適です。カーネル同期プリミティブの使用に関する優れたポッドキャストがhttp://www.mac-developer-network.com/shows/podcasts/lnc/lnc032/にあります。