Objective c pthread_mutex_t VS@synchronized block? 静态pthread\u mutex\u t gLock//全球的 pthread_mutex_init(&gLock,NULL)//初始 pthread_mutex_lock(&gLock); 例如(int i=0;i

Objective c pthread_mutex_t VS@synchronized block? 静态pthread\u mutex\u t gLock//全球的 pthread_mutex_init(&gLock,NULL)//初始 pthread_mutex_lock(&gLock); 例如(int i=0;i,objective-c,multithreading,cocoa,mutex,synchronized,Objective C,Multithreading,Cocoa,Mutex,Synchronized,您将全局锁(所有实例一个锁)与对象级递归锁(每个实例一个锁,可以从同一线程多次获取)进行比较。这些锁通常是不可互换的——它们的操作和保护非常不同 好消息是,您可以使用pthread\u mutex\u t作为递归锁,该锁对于每个实例都是唯一的,以便实现与@synchronized相同的保护级别。使用pthread\u mutex\u t还可以使锁的获取速度大大加快 要使用pthread互斥体实现与@synchronized相同的效果,请将pthread\u mutex\u t gLock声明为实

您将全局锁(所有实例一个锁)与对象级递归锁(每个实例一个锁,可以从同一线程多次获取)进行比较。这些锁通常是不可互换的——它们的操作和保护非常不同

好消息是,您可以使用
pthread\u mutex\u t
作为递归锁,该锁对于每个实例都是唯一的,以便实现与
@synchronized
相同的保护级别。使用
pthread\u mutex\u t
还可以使锁的获取速度大大加快

要使用pthread互斥体实现与
@synchronized
相同的效果,请将
pthread\u mutex\u t gLock
声明为实例变量,然后在
-init
中将其初始化为递归互斥体。最后,在
-dealoc
中销毁互斥体

当然,如果子类和基类依赖于
@synchronized
的语义通过对象层次结构做正确的事情,那么它们可能需要访问这个锁


@synchronized
与递归pthread互斥体(上次我检查过)相比速度非常慢。

贾斯汀是对的;不过,还有另一个细节,那就是异常处理 以下提示:

作为预防措施,@synchronized块隐式地将异常处理程序添加到受保护的代码中。此处理程序在引发异常时自动释放互斥体。这意味着为了使用@synchronized指令,还必须在代码中启用Objective-C异常处理。如果不希望隐式异常处理程序导致的额外开销,您应该考虑使用锁类。


如果<代码> [消息计数] <代码>可以引发异常,可以跳过解锁代码并将其楔入。

…如果您可以恢复。大多数COA异常都是不可恢复的(至少,如果您希望以后可执行)。通常的情况是可恢复的异常是C++(可预测恢复)。.h文件中的pthread_mutexttr_t attr;pthread_mutex_t mutex;init pthread_mutexttr_settype(&attr,pthread_mutex_RECURSIVE);pthread_mutex_init(&mutex,&attr);dealloc pthread_mutex_destroy(&mutex);在我的函数中pthread_mutex_锁(&mutex);cfsetremovallvalues(mySet);pthread_mutex_mutex_解锁(&mutex);这样可以吗?@parabafna)互斥属性可以是
静态的
,用于您创建的每个互斥-或非静态的,仅用于
-init
b)互斥属性不需要是ivar c)您应该验证结果代码d)在某些情况下,您可能更喜欢
pthread\u mutex\u trylock
。e) 应该使用初始值设定项初始化结构。除此之外,看起来不错!准备快速锁定=)结果代码主要用于检测锁定和线程错误。pthread_mutex_lock和pthread_mutex_unlock返回错误代码22I忘记写入pthread_mutexttr_init(&attr);在init中,现在工作正常。我在其他类中也使用相同的CFMutableSet,我应该怎么做?
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);
@synchronized(mSet)
{
for(int i=0;i<[message count];i++)
    CFSetAddValue(mSet, [message objectAtIndex:i]);
}