当我尝试锁定它并且它被锁定在其他地方时,我需要一个不使用一个 cpu 的可可锁。在内核调度程序中实现的东西。
4 回答
听起来您正试图找到一个不是自旋锁的锁。每个锁都必须使用一些 CPU,否则它无法运行。:-)
NSLock 在 Cocoa 中是最明显的。它有一个简单的 -lock、-unlock 接口,并在其实现中使用 pthread 互斥锁。Cocoa 中有许多更复杂的锁来满足更具体的需求:NSRecursiveLock、NSCondition、NSDistributedLock 等。
还有一个 @synchronized 指令,它使用起来更简单,但有一些额外的开销。
如果您正在寻找类似的东西,GCD 也有一个计数的信号量对象。
我的建议是,不要使用锁,而是使用 NSOperations 和 NSOperationQueue-setMaxConcurrentOperationCount:
来访问共享资源。通过使用单宽操作队列,您可以保证一次只有一件事会使用资源,同时仍然允许多个线程这样做。
这避免了对锁的需求,并且由于一切都在用户空间中完成,因此可以提供更好的性能。我已经用这种技术替换了几乎所有围绕共享资源的锁定,并且对结果非常满意。
您的意思是“锁定”,如线程之间的互斥锁,进程之间的互斥锁,或网络上不同资源之间的互斥锁,还是......?
如果它在线程之间,则使用NSLock。如果它在进程之间,那么您可以使用名为 semaphores的 POSIX 。
如果你真的想要内核锁并且知道你在做什么,你可以使用
<libkern/OSAtomic.h>
请务必始终使用“屏障”变体。这些比 posix 锁更快,也更危险。如果您可以使用新代码以 10.6 为目标,那么 GCD 是一个不错的选择。有一个关于使用内核同步原语的很棒的播客:http: //www.mac-developer-network.com/shows/podcasts/lnc/lnc032/