// Listing 4-2 Using a mutex lock
void MyMutexInitFunction()
{
pthread_mutex_init(&mutex,NULL);
}
void MyLockingFunction()
{
// Lock the mutex
pthread_mutex_lock(&mutex);
// Do real the work
// unlock the mutex
pthread_mutex_unlock(&mutex);
}
2,使用NSLock类
Cocoa中所有的锁的接口实际上都是通过NSLocking协议定义的,除了定义了lock/unlock方法外,还定义了tryLock/lockBeforeDate:方法。tryLock方法试图获取一个锁,如果所不可用,他不会阻塞线程,相反,他只返回NO。lockBeforeDate:方法试图获取一个锁,如果锁没有在规定的时间内被获取到,他会让线程,从阻塞状态变为非阻塞状态(或者返回NO)。
- (void)testUsingLock
{
BOOL moreToDo = NO;
NSLock *theLock = [[NSLock alloc] init];
while(moreToDo)
{
/* Do another increment of calculation */
/* until there's no more to do. */
if([theLock tryLock])
{
/* Update the display used by all threads */
[theLock unlock];
}
}
}
3,使用@synchronized指令
@synchronized指令做和其他互斥锁一样的工作(防止不同线程在同一时间获取同一个锁)
- (void)MyMethod:(id)anObj
{
@synchronized(anObj)
{
// Everything between the braces is protected by the @synchronized directive.
}
}
创建@synchronized(anObj)指令的对象是一个用来区别保护块的唯一标示符,如果在不同线程调用上述方法,如果每次在线程传递的不同的对象给anObj,那么每次他都将拥有他的锁,并持续处理,而不被其他线程阻塞。如果传递的是同一参数,那么该线程被阻塞,直到前一个线程解锁后,才能继续处理
另,@synchronized()块隐式的添加一个异常处理例程来保护代码,所以需要在程序中启用异常处理。
4,使用其他锁
1)使用NSRecursiveLock对象---递归锁
对同一线程,可以多次获得(lock)而不会造成死锁,注意的是lock/unlock需要配对出现
NSRecursiveLock*theLock = [[NSRecursiveLockalloc]init];
- (void)MyRecursiveLockFunction:(int)value
{
[theLock lock];
if(value != 0)
{
-- value;
[selfMyRecursiveLockFunction:value];
}
[theLock unlock];
}
2)使用NSConditionLock对象---条件锁
条件锁是一个互斥锁,可以通过特定值来锁住和解锁。
NSConditionLock的锁住和解锁的方法,unlockWithCondition:和lock消息,或者lockWhenCondition:和unlock消息。两对可以任意组合使用
===生产者-消费者问题
#define NO_DATA 0
#define HAS_DATA 1
isEmpty=NO;
NSConditionLock *condLock= [[NSConditionLockalloc]initWithCondition:NO_DATA];
//生产者线程数据处理流程
- (void)MyConditionLockPruductor
{
while(true)
{
[condLock lock];
/* Add data to the queue */
[condLockunlockWithCondition:HAS_DATA];
}
}
//消费者线程数据处理流程
- (void)MyConditionLockCustomer
{
while(true)
{
[condLocklockWhenCondition:HAS_DATA];
/* remove data from the queue */
[condLockunlockWithCondition:(isEmpty?NO_DATA:HAS_DATA)];
// Process the data locally.
}
}
3)使用NSDistributedLock对象---分布锁
用于协调多台主机访问某系共享资源,比如一个文件/一个目录等。和其他lock锁的不同,NSDistributedLock对象并没有实现NSLocking协议,所以他没有lock方法。不过提供了一个tryLock方法,可以通过breadLock方法打破现在锁。