Objective-C中是如何实现线程同步的? 网络的同步、异步区别

2024-08-28 11:18

本文主要是介绍Objective-C中是如何实现线程同步的? 网络的同步、异步区别,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

多线程在各种编程语言中都是难点,很多语言中实现起来很麻烦,objective-c虽然源于c,但其多线程编程却相当简单,可以与java相媲美。这篇文章主要从线程创建与启动、线程的同步与锁、线程的交互、线程池等等四个方面简单的讲解一下iphone中的多线程编程。   
一、线程创建与启动   
线程创建主要有二种方式:   
当然,还有一种比较特殊,就是使用所谓的convenient method,这个方法可以直接生成一个线程并启动它,而且无需为线程的清理负责。这个方法的接口是:    
+ (void)detachNewThreadSelector:(SEL)aSelector toTarget:(id)aTarget withObject:(id)anArgument   
前两种方法创建后,需要手机启动,启动的方法是:   
- (void)start;   
二、线程的同步与锁   
要说明线程的同步与锁,最好的例子可能就是多个窗口同时售票的售票系统了。我们知道在java中,使用synchronized来同步,而iphone虽然没有提供类似java下的synchronized关键字,但提供了NSCondition对象接口。查看NSCondition的接口说明可以看出,NSCondition是iphone下的锁对象,所以我们可以使用NSCondition实现iphone中的线程安全。这是来源于网上的一个例子:   
SellTicketsAppDelegate.h 文件   
//  SellTicketsAppDelegate.h   
import <UIKit/UIKit.h>   
    
@interface SellTicketsAppDelegate : NSObject <UIApplicationDelegate> {   
     int tickets;   
     int count;   
     NSThread* ticketsThreadone;   
     NSThread* ticketsThreadtwo;   
     NSCondition* ticketsCondition;   
     UIWindow *window;   
 }   
@property (nonatomic, retain) IBOutlet UIWindow *window;   
@end   
SellTicketsAppDelegate.m 文件   
//  SellTicketsAppDelegate.m   
import "SellTicketsAppDelegate.h"  
    
@implementation SellTicketsAppDelegate   
@synthesize window;   
    
- (void)applicationDidFinishLaunching:(UIApplication *)application {   
     tickets = 100;   
     count = 0;   
     // 锁对象   
     ticketCondition = [[NSCondition alloc] init];   
     ticketsThreadone = [[NSThread alloc] initWithTarget:self selector:@selector(run) object:nil];   
     [ticketsThreadone setName:@"Thread-1"];   
     [ticketsThreadone start];     
    
    
     ticketsThreadtwo = [[NSThread alloc] initWithTarget:self selector:@selector(run) object:nil];   
     [ticketsThreadtwo setName:@"Thread-2"];   
     [ticketsThreadtwo start];   
     //[NSThread detachNewThreadSelector:@selector(run) toTarget:self withObject:nil];   
      // Override point for customization after application launch   
     [window makeKeyAndVisible];    
    
 }   
    
- (void)run{   
     while (TRUE) {   
        // 上锁   
        [ticketsCondition lock];   
         if(tickets > 0){   
             [NSThread sleepForTimeInterval:0.5];   
             count = 100 - tickets;   
             NSLog(@"当前票数是:%d,售出:%d,线程名:%@",tickets,count,[[NSThread currentThread] name]);   
             tickets--;   
         }else{   
             break;   
        }   
         [ticketsCondition unlock];   
     }   
 }   
    
- (void)dealloc {   
    [ticketsThreadone release];   
     [ticketsThreadtwo release];   
     [ticketsCondition release];    
     [window release];   
     [super dealloc];   
}   
@end   
三、线程的交互   
线程在运行过程中,可能需要与其它线程进行通信,如在主线程中修改界面等等,可以使用如下接口:   
- (void)performSelectorOnMainThread:(SEL)aSelector withObject:(id)arg waitUntilDone:(BOOL)wait   
由于在本过程中,可能需要释放一些资源,则需要使用NSAutoreleasePool来进行管理,如:   
- (void)startTheBackgroundJob {   
    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];   
    // to do something in your thread job   
    ...   
    [self performSelectorOnMainThread:@selector(makeMyProgressBarMoving) withObject:nil waitUntilDone:NO];   
    [pool release];   
}   
如果你什么都不考虑,在线程函数内调用 autorelease 、那么会出现下面的错误:   

.NSAutoReleaseNoPool(): Object 0x********* of class NSConreteData autoreleased with no pool in place ….   

线程同步和线程异步有什么区别?(重要基础知识)
打个比方,如果你在等一个人,
同步的时候,你会一直等到她来了之后才做其他事情,这个过程除了等待你啥都不会做,
异步的时候,你一边在等,可能一边玩游戏或者是看报纸什么的,一直到她到来,你的等待状态才会结束
在实现上,同步的过程会阻塞进程的所有其他操作,将同步转换为异步的最常见方法则是
将会阻塞进程的等待操作放入到一个新的进程中,同时为该等待操作添加一个监视器,在检测到等待操作完成的时候结束等待的进程。


这篇关于Objective-C中是如何实现线程同步的? 网络的同步、异步区别的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1114607

相关文章

HTML5 getUserMedia API网页录音实现指南示例小结

《HTML5getUserMediaAPI网页录音实现指南示例小结》本教程将指导你如何利用这一API,结合WebAudioAPI,实现网页录音功能,从获取音频流到处理和保存录音,整个过程将逐步... 目录1. html5 getUserMedia API简介1.1 API概念与历史1.2 功能与优势1.3

Java实现删除文件中的指定内容

《Java实现删除文件中的指定内容》在日常开发中,经常需要对文本文件进行批量处理,其中,删除文件中指定内容是最常见的需求之一,下面我们就来看看如何使用java实现删除文件中的指定内容吧... 目录1. 项目背景详细介绍2. 项目需求详细介绍2.1 功能需求2.2 非功能需求3. 相关技术详细介绍3.1 Ja

使用Python和OpenCV库实现实时颜色识别系统

《使用Python和OpenCV库实现实时颜色识别系统》:本文主要介绍使用Python和OpenCV库实现的实时颜色识别系统,这个系统能够通过摄像头捕捉视频流,并在视频中指定区域内识别主要颜色(红... 目录一、引言二、系统概述三、代码解析1. 导入库2. 颜色识别函数3. 主程序循环四、HSV色彩空间详解

PostgreSQL中MVCC 机制的实现

《PostgreSQL中MVCC机制的实现》本文主要介绍了PostgreSQL中MVCC机制的实现,通过多版本数据存储、快照隔离和事务ID管理实现高并发读写,具有一定的参考价值,感兴趣的可以了解一下... 目录一 MVCC 基本原理python1.1 MVCC 核心概念1.2 与传统锁机制对比二 Postg

SpringBoot整合Flowable实现工作流的详细流程

《SpringBoot整合Flowable实现工作流的详细流程》Flowable是一个使用Java编写的轻量级业务流程引擎,Flowable流程引擎可用于部署BPMN2.0流程定义,创建这些流程定义的... 目录1、流程引擎介绍2、创建项目3、画流程图4、开发接口4.1 Java 类梳理4.2 查看流程图4

C++中零拷贝的多种实现方式

《C++中零拷贝的多种实现方式》本文主要介绍了C++中零拷贝的实现示例,旨在在减少数据在内存中的不必要复制,从而提高程序性能、降低内存使用并减少CPU消耗,零拷贝技术通过多种方式实现,下面就来了解一下... 目录一、C++中零拷贝技术的核心概念二、std::string_view 简介三、std::stri

C++高效内存池实现减少动态分配开销的解决方案

《C++高效内存池实现减少动态分配开销的解决方案》C++动态内存分配存在系统调用开销、碎片化和锁竞争等性能问题,内存池通过预分配、分块管理和缓存复用解决这些问题,下面就来了解一下... 目录一、C++内存分配的性能挑战二、内存池技术的核心原理三、主流内存池实现:TCMalloc与Jemalloc1. TCM

OpenCV实现实时颜色检测的示例

《OpenCV实现实时颜色检测的示例》本文主要介绍了OpenCV实现实时颜色检测的示例,通过HSV色彩空间转换和色调范围判断实现红黄绿蓝颜色检测,包含视频捕捉、区域标记、颜色分析等功能,具有一定的参考... 目录一、引言二、系统概述三、代码解析1. 导入库2. 颜色识别函数3. 主程序循环四、HSV色彩空间

Before和BeforeClass的区别及说明

《Before和BeforeClass的区别及说明》:本文主要介绍Before和BeforeClass的区别及说明,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录Before和BeforeClass的区别一个简单的例子当运行这个测试类时总结Before和Befor

Python实现精准提取 PDF中的文本,表格与图片

《Python实现精准提取PDF中的文本,表格与图片》在实际的系统开发中,处理PDF文件不仅限于读取整页文本,还有提取文档中的表格数据,图片或特定区域的内容,下面我们来看看如何使用Python实... 目录安装 python 库提取 PDF 文本内容:获取整页文本与指定区域内容获取页面上的所有文本内容获取