IOS异步和多线程操作&&在sqlite3中的应用
1,数据库I/O操作(异步)
数据库本身是存储在磁盘上。访问和修改数据库,即对磁盘进行读写,即I/O操作。
磁盘属于计算机硬件,具有DMA能力,不需要CPU干预,可以实现异步操作。
I/O操作一般是消耗时间,sqlite使用异步处理I/O操作。
当有多个事务对数据库进行操作,对应,也会有多个I/O操作。
操作系统将I/O操作,合理放入一个I/O队列。一次性将队列内的I/O操作提交给磁盘系统,并行处理多个I/O,提高效率。详细请看链接,本人也没有特别深入研究。
2,异步和多线程
异步和多线程,都有能力实现,不阻塞当前线程,使应用更“流畅”。 IOS最常见的, 不阻塞主线程,使UI表现更流畅。
两者有区别。 具体请看链接。
总之,异步的实现,是基于计算机硬件的支持,而多线程,是操作系统中,一段逻辑代码控制的。
3,线程安全以及处理
当一段代码或者某个变量,被多个线程同时访问和使用。 这些代码或者变量,可能会出现非预期的效果,比如数据紊乱和数据安全的问题,这是“非安全的”。
为了线程安全, 需要在同一时刻,只能有一个线程访问这些代码或者变量,IOS中使用“互斥锁”,来避免这个情况。
(互斥,mutex,从本身词语意思:不相容,互相排斥的。数学上,A和B互斥, 指A和B没有任何交集。 A和B不能同时发生。)
“互斥锁”即@synchronized(对象A) {} ,对象A,只能被一个线程访问。
因此,如果使用“互斥锁”,一定是在, 多个线程,同时访问一份资源的情况。
互斥锁,增加了CPU的开销。IOS中,atomic,就是为 setter 方法增加“互斥锁”。比不要的情况下,一定要使用“nonatomic”。
4,sqlite3以及sqlite3的多线程
sqlite3是轻量级的数据库。sqlite3同样使用异步I/O操作,来读取数据。关于sqlite3异步I/O操作,具体请看链接。
IOS中的sqlite3是线程安全的。IOS中UI在主线程,不阻塞UI线程,保证流畅,所以把sqlite的操作,需要迁移到子线程。这是sqlite3使用多线程的主要驱动力。
有一篇很好的文章,具体点击链接。
- (1),单线程:禁用所有的mutex锁,并发使用时会出错。当SQLite编译时加了SQLITE_THREADSAFE=0参数,或者在初始化SQLite前调用sqlite3_config(SQLITE_CONFIG_SINGLETHREAD)时启用。
- (2),多线程:只要一个数据库连接不被多个线程同时使用就是安全的。源码中是启用bCoreMutex,禁用bFullMutex。实际上就是禁用数据库连接和prepared statement(准备好的语句)上的锁,因此不能在多个线程中并发使用同一个数据库连接或prepared statement。当SQLite编译时加了SQLITE_THREADSAFE=2参数时默认启用。若SQLITE_THREADSAFE不为0,可以在初始化SQLite前,调用sqlite3_config(SQLITE_CONFIG_MULTITHREAD)启用;或者在创建数据库连接时,设置SQLITE_OPEN_NOMUTEX flag。
- (3),串行:启用所有的锁,包括bCoreMutex和bFullMutex。因为数据库连接和prepared statement都已加锁,所以多线程使用这些对象时没法并发,也就变成串行了。当SQLite编译时加了SQLITE_THREADSAFE=1参数时默认启用。若SQLITE_THREADSAFE不为0,可以在初始化SQLite前,调用sqlite3_config(SQLITE_CONFIG_SERIALIZED)启用;或者在创建数据库连接时,设置SQLITE_OPEN_FULLMUTEX flag。
IOS中的sqlite,默认使用(2)的配置。不方便的是,如果要被另外的线程访问sqlite,其他的就必须关闭数据库连接。 代码中就有很多不方便的地方。
配置(1)不考虑,为单线程。
配置(3),将多线程变串行方式执行,
(暂停。。)
IOS异步和多线程操作&&在sqlite3中的应用的更多相关文章
- Task:取消异步计算限制操作 & 捕获任务中的异常
Why:ThreadPool没有内建机制标记当前线程在什么时候完成,也没有机制在操作完成时获得返回值,因而推出了Task,更精确的管理异步线程. How:通过构造方法的参数TaskCreationOp ...
- ios 异步处理耗时操作
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0); dispatch_asy ...
- iOS开发多线程在实际项目中的运用
实际项目开发中为了能够给用户更好的体验,有些延时操作我们都会放在子线程中进行. 今天我们就来聊聊多线程在实际项目中的运用. 我们先来看看多线程的基础知识: 1.多线程的原理: 同一时间,CPU只能处理 ...
- C#中异步和多线程的区别
C#中异步和多线程的区别是什么呢?异步和多线程两者都可以达到避免调用线程阻塞的目的,从而提高软件的可响应性.甚至有些时候我们就认为异步和多线程是等同的概念.但是,异步和多线程还是有一些区别的.而这些区 ...
- C# 多线程操作之异步委托
标签: 多线程任务nullstringhtml工作 2012-06-29 23:00 1276人阅读 评论(0) 收藏 举报 分类: C/C++/C#/dotnet(126) 目录(?)[+] ...
- C#中的异步和多线程
许多开发人员对异步代码和多线程以及它们的工作原理和使用方法都有错误的认识.在这里,你将了解这两个概念之间的区别,并使用c#实现它们. 我:"服务员,这是我第一次来这家餐厅.通常需要4个小时才 ...
- C# winform编程中多线程操作控件方法
private void Form1_Load(object sender, EventArgs e) { Thread newthread = new Thread(new ThreadStart( ...
- 多线程操作(循环往listbox中添加数据)
一.先造一个窗体,其中就开始按钮,暂停按钮,以及listbox文本框 二.当点击开始的时候,数据会无限的往listbox中加,为了防止卡住和提升效率,便造了一个新的线程来执行开始操作 namespac ...
- PHP中实现异步调用多线程程序代码
本文章详细的介绍了关于PHP中实现异步调用多线程方法,下面我们以给1000个用户发送一封推荐邮件,用户输入或者导入邮件账号了提交服务器执行发送来讲述. 比如现在有一个场景,给1000个用户发送一封推荐 ...
随机推荐
- Spark MLlib知识点学习整理
MLlib的设计原理:把数据以RDD的形式表示,然后在分布式数据集上调用各种算法.MLlib就是RDD上一系列可供调用的函数的集合. 操作步骤: 1.用字符串RDD来表示信息. 2.运行MLlib中的 ...
- jsPlumb
官网:https://jsplumbtoolkit.com GitHub:https://github.com/sporritt/jsplumb/ 初始化 jsPlumb只有等到DOM初始化完成之后才 ...
- 为什么引用不了App_Code里的类
在Web应用程序中不能通过右键项目-〉”添加“-〉”添加ASP.NET文件夹“方式添加 .因为Web应用程序中App_Code就不存在 .不过可以通过手动的方式创建,添加一个文件夹命名为App_Cod ...
- NodeJS 学习资料
1. npm 除Node本身提供的API外,现在有不少第三方模块可极大的提高开发效率,npm就是Node的软件包管理器,可以用它安装所需软件包并发布自己为nodejs写的软件包. npm安装node扩 ...
- Linux vmstat命令--监控CPU 性能分析
top是给Linux设计的.在FreeBSD VM里面的Free概念和其他OS完全不同,使用top查看Free内存对于FreeBSD来说可以说没什么意义.正确的方法是看vmstat. vmstat是V ...
- Maven内置隐式变量(转)
Maven提供了三个隐式的变量可以用来访问环境变量,POM信息,和Maven Settings env env变量,暴露了你操作系统或者shell的环境变量.便 如在Maven POM中一个对${en ...
- iOS字符串加密至MD5&及获取文件MD5
iOS 字符串加密至MD5 #import <CommonCrypto/CommonDigest.h> + (NSString *) md5:(NSString *)str { const ...
- rbenv安装ruby2.3.0在线安装不上。老子出绝招了(更新)
今天把系统换成Linux mint了.感觉比ubuntu的好用太多,细节真是不错,Ubuntu感觉就是毛坯房,Linux mint真是精装修啊 问题来了.安装rbenv后,然后安装rbenv-buil ...
- 安装程序无法复制文件 convlog.exe的解决方法
在安装的时候出现一个错误提示“安装程序无法复制文件CONVLOG.EX_”,上网找了很多资料,都说是因为版本问题,考虑到自己的服务器安装的是2003 SP1,后来打了补丁到SP2的,也就认为是版本问题 ...
- SQL Server 2005中的分区表(三):将普通表转换成分区表(转)
在设计数据库时,经常没有考虑到表分区的问题,往往在数据表承重的负担越来越重时,才会考虑到分区方式,这时,就涉及到如何将普通表转换成分区表的问题了. 那么,如何将一个普通表转换成一个分区表 呢?说到底, ...