gpt4 book ai didi

objective-c - pthread_mutex_t VS @synchronized block ?

转载 作者:太空狗 更新时间:2023-10-30 03:42:23 25 4
gpt4 key购买 nike

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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com