本文档版权归NickTang所有,没有本人书面或电子邮件允许,不许转载,摘录,发表。多谢!
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运行器会捕获这个异常,然后是否这个信号量(以利于受保护资源能被其他线程访问),然后前转者个异常到后继异常处理模块。
分享到:
相关推荐
在Windows编程领域,MFC(Microsoft Foundation Classes)是微软提供的一套C++库,用于简化Windows应用程序的开发,包括创建用户界面和实现多线程功能。MFC中的多线程技术使得程序能够同时执行多个任务,提高应用的...
在C#中,由于使用线程和调用UI的线程属于两个不同的线程,如果在线程中直接设置UI元素的属性,此时就会出现跨线程错误。 下面介绍两种解决方案 第一种:使用控件自带的Invoke或者BeginInvoke方法。 Task....
基于SpringBoot和POI实现单线程和多线程导出Excel.zip基于SpringBoot和POI实现单线程和多线程导出Excel.zip基于SpringBoot和POI实现单线程和多线程导出Excel.zip基于SpringBoot和POI实现单线程和多线程导出Excel.zip...
在VC++编程环境中,线程同步是一个至关重要的概念,特别是在多线程程序设计中,以确保并发执行的线程能够安全地访问共享资源,避免数据竞争和其他潜在的问题。本篇文章将详细探讨线程锁在VC++中的应用,以及如何通过...
在计算机编程中,多线程是一种并发执行任务的机制,它可以极大地提高程序的执行效率,尤其是在处理大量数据或需要同时进行多个操作时。本主题主要关注如何在已有的线程中创建子线程,实现更复杂的并发执行模式。 ...
本文将深入探讨如何挂起线程、休眠线程以及终止线程,这些都是多线程编程中的关键概念。 首先,让我们了解线程的基本概念。线程是程序执行的流程,每个进程至少有一个线程。在多线程环境中,多个线程可以共享同一...
"系统线程(内核线程)和用户线程区别" 系统线程(内核线程)和用户线程是两种不同的线程模式,它们在实现和应用方面有很大的区别。 系统线程(内核线程)是由操作系统内核创建和撤销的线程,内核维护进程及线程的...
### MFC多线程的创建详解 #### 一、MFC多线程概述 MFC (Microsoft Foundation Classes) 是微软为简化Windows程序开发提供的一套类库,它封装了Win32 API,使得开发者能够更加方便地进行Windows应用程序的开发。在...
在计算机编程领域,尤其是涉及到实时系统和并发编程时,线程锁和线程安全变量是至关重要的概念。LabWindows/CVI是一种流行的交互式C开发环境,特别适合于开发科学和工程应用。本实例将深入探讨如何在LabWindows/CVI...
单线程和多线程是计算机程序执行时的两种不同模型,它们在处理并发任务、资源管理和性能上有着显著的差异。理解这两种模型是编程尤其是服务器端开发的基础,尤其是在Java、C#等支持多线程的编程语言中。 首先,让...
本文将深入探讨“C#内存释放-线程控制-线程启动-线程暂停”这一主题,结合提供的WFormsThread文件,我们可以假设这是一个关于Windows Forms应用程序中线程管理的实例。 首先,让我们关注线程控制。在C#中,我们通常...
在多线程编程中,线程间的协作是关键任务之一,尤其当需要一个线程在完成特定工作后通知另一个线程继续执行时。这个过程通常涉及到线程同步和异步的概念。本文将深入探讨线程异步工作以及如何在C++中实现一个线程在...
本篇文章将深入探讨如何在MFC中创建多线程,特别是工作者线程,并且会针对`AfxBeginThread`和`BeginThread`两种方法进行比较。 首先,我们来看标题所提到的“MFC创建多线程(工作者线程)demo”。工作者线程通常...
在编程领域,多线程是一种常见且强大的技术,它允许程序同时执行多个任务,从而提高效率和响应性。本主题聚焦于Delphi 7中实现的多线程测试,特别是涉及40个并发线程的情况。Delphi是Embarcadero开发的一款集成开发...
在IT行业中,多线程是程序设计中的一个重要概念,特别是在C#编程中。"大漠多线程模板"是一个专门针对C#开发的多线程处理框架,它为开发者提供了便捷的方式来管理和优化多线程应用。这个框架由知名开发者"大漠"创建,...
在这个项目中,“TCP-接收线程和发送线程”是一个C/C++实现的多线程编程示例,旨在展示如何在服务器端和客户端之间有效地管理数据的接收和发送。以下将详细介绍相关的知识点。 首先,我们要理解TCP的基本原理。TCP...
在.NET框架中,C#语言提供了强大的多线程支持,使得开发者可以充分利用现代多核处理器的优势,实现并行处理和高效能编程。本资源包含六个C#.NET多线程的实例,涵盖了多线程的基本使用到更高级的概念,如线程互斥。...
"多线程编程基础知识" 多线程编程是指在一个程序中同时执行多个线程的技术。每个线程都是一个独立的执行路径,拥有自己的程序计数器、寄存器和堆栈空间。多线程编程可以提高程序的执行效率和响应速度,但也增加了...
在编程领域,线程是程序执行的基本单元,特别是在多任务操作系统中。易语言是一种中文编程环境,它提供了方便的线程操作接口。本篇将详细探讨如何在易语言中实现“正确退出线程”这一重要知识点。 首先,理解线程的...
在编程领域,尤其是在开发高效、响应迅速的应用程序时,多线程技术扮演着至关重要的角色。Qt5框架提供了一种方便的方式来实现多线程,它允许开发者在不同的线程中执行任务,从而避免主线程(GUI线程)因处理耗时操作...