static pthread_mutex_t gLock; //global
pthread_mutex_init(&gLock,NULL); //in init
pthread_mutex_lock(&gLock);
for(int i=0;i<[message count];i++)
CFSetAddValue(mSet, [message objectAtIndex:i]);
pthread_mutex_unlock(&gLock);
我的 Cocoa 应用程序正在使用 pthread_mutex_t 进入无响应模式。
@synchronized(mSet)
{
for(int i=0;i<[message count];i++)
CFSetAddValue(mSet, [message objectAtIndex:i]);
}
我的应用程序在使用同步块(synchronized block)时运行良好。
为什么?
最佳答案
您将全局锁(所有实例一个锁)与对象级递归锁(每个实例一个锁,可能从同一线程获取多次)进行比较。它们通常不可互换——它们的运作和保护彼此截然不同。
好消息是,您可以使用pthread_mutex_t
作为每个实例唯一的递归锁,以实现与@synchronized
相同程度的保护。使用 pthread_mutex_t
还可以更快地获取锁。
要使用 pthread mutex 实现与 @synchronized
相同的效果,将 pthread_mutex_t gLock
声明为实例变量,然后在 中将其初始化为递归互斥锁 -初始化
。最后,销毁-dealloc
中的互斥锁。
当然,如果子类和基类依赖于 @synchronized
的语义来通过对象层次结构做正确的事情,它们可能需要访问这个锁。
@synchronized
与递归 pthread 互斥锁相比非常慢(我最后检查过)。
关于objective-c - pthread_mutex_t VS @synchronized block ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9463525/