objective-c - pthread_mutex_t VS @synchronized block ?

标签 objective-c multithreading cocoa mutex synchronized

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/

相关文章:

objective-c - 如何使用NSScrollview?

iphone-sdk : Adding a textfield to UIAlertview does not work in iOS 4?

c++ - 使用 Objective-C 和 C++ 避免并行数组

cocoa - 迁移复杂的核心数据模型

objective-c - cocoa 事件水龙头

ios - iOS 中的多个持久存储协调器

c++ - 共享内存系统性能上的消息传递接口(interface)

java - 多线程修改StringBuilder

c# - 现在,为什么 Monitor 需要一个条件变量?

macos - CFBundleTypeIconFile 图标未显示给定的文件扩展名