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