ObjC 线程同步加锁[转]
来源:互联网 发布:360游戏优化 编辑:程序博客网 时间:2024/06/06 20:02
Objective-C对线程同步和异常处理提供支持,关于异常处理,请参考“Exception Handling.” 你可以使用编译标记-fobjc-exceptions来打开对异常的支持,不过必须是在GCC3.3或以上版本中才能使用。
注: 只是线程同步或异常的程序必须在Mac OS X10.3版本或以上的系统运行,应为以前的版本不支持这些特性。
Objective-C支持多线程。因此会存在两个线程在同一个时间访问同一资源的可能,这是一个很危险的事情。为了让一个线程能一次不受打断的执行完一段代码,Objective-C提供了@synchronized()来阻止上面这样事情的发生。
@synchronized()导致被保护的代码块只能被一个线程执行,其他的线程在试图执行这个代码块的时候会被阻塞,直到当前正在执行这个代码块的线程执行完这个代码块的最后一句话。
@synchronized()可以使用一个Objective-C对象(包括self)来作为参数。这个对象作为信号量使用。它可以锁住一节代码,免得多个线程进入。在程序,你应该使用不同的信号量来锁不同的代码。在程序进入多线程前创建所有的心好了,以避免有争用的情况出现。
Listing 11-1演示了使用self作为信号量来锁住这个实例函数的代码。在稍后的例子中,任何时候只有一个线程执行受保护的代码,因为它使用了但例模式。
Listing 11-1 使用self对函数加锁
- (void)criticalMethod{ @synchronized(self) { // Critical code. ... }}一般情况下,我们使用Listing 11-2演示的方式。在获得对互斥资源的访问前,你需要使用获得Account类的信号量,然后对这个信号量加锁。这个信号量一般在Account类的初始化函数中创建。
Listing 11-2 使用自定义互斥量加锁
Account *account = [Account accountFromString:[accountField stringValue]];// Get the semaphore.id accountSemaphore = [Account semaphore];@synchronized(accountSemaphore) { // Critical code. ...}Objective-C的同步机制支持回归调用和重入机制。一个线程可以多次对一个信号量加锁;其他的线程会等到这个线程对这个信号量的所有解锁。也就是说,每一个@synchronized()块都正常退出或抛出异常。
当在@synchronized()块中代码抛出了一个异常,Objective-C运行器会捕获这个异常,然后是否这个信号量(以利于受保护资源能被其他线程访问),然后前转者个异常到后继异常处理模块。
转自:http://www.it900.net/yingyongchengxu/268.html
- ObjC 线程同步加锁[转]
- Objc 线程及线程同步
- 线程同步(两个线程同步 加锁)
- java线程研究---(9)Thread同步:如何加锁
- 如何采用不加锁的方式实现线程同步
- 同步,一定要加锁吗?
- 是否加锁同步备忘
- Android 同步与加锁
- java多线程三种方式区别,java多线程,线程同步方式,线程同步加锁的方法,wait与sleep区别
- 线程银行转账加锁
- java线程加锁
- 线程加锁this详解
- Java线程加锁方式
- Win32下两种用于C++的线程同步类(多线程实现加锁解锁)
- Win32下两种用于C++的线程同步类(多线程实现加锁解锁) .
- Win32下两种用于C++的线程同步类(多线程实现加锁解锁)
- Win32下两种用于C++的线程同步类(多线程实现加锁解锁)
- java线程同步的三种方法[synchronized关键字,Lock加锁,信号量Semaphore]
- Linux环境进程间通信
- android之弹窗popupWindow
- spring中使用jdbc
- Git常用命令解说
- spring+jdbc
- ObjC 线程同步加锁[转]
- 用C语言实现一个revert函数,它的功能是将输入的字符串在原串上倒序后返回。
- Java设计模式---单例模式(双锁机制的弊端)
- 敬业是一种态度
- 发现身边感动,寻找最美龙江测绘人
- 关于java是否存在内存泄露的问题
- 日期操作类
- sort函数的用法
- ubuntu 下安装pps后无法播放的解决方法