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中的应用的更多相关文章

  1. Task:取消异步计算限制操作 & 捕获任务中的异常

    Why:ThreadPool没有内建机制标记当前线程在什么时候完成,也没有机制在操作完成时获得返回值,因而推出了Task,更精确的管理异步线程. How:通过构造方法的参数TaskCreationOp ...

  2. ios 异步处理耗时操作

    dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0); dispatch_asy ...

  3. iOS开发多线程在实际项目中的运用

    实际项目开发中为了能够给用户更好的体验,有些延时操作我们都会放在子线程中进行. 今天我们就来聊聊多线程在实际项目中的运用. 我们先来看看多线程的基础知识: 1.多线程的原理: 同一时间,CPU只能处理 ...

  4. C#中异步和多线程的区别

    C#中异步和多线程的区别是什么呢?异步和多线程两者都可以达到避免调用线程阻塞的目的,从而提高软件的可响应性.甚至有些时候我们就认为异步和多线程是等同的概念.但是,异步和多线程还是有一些区别的.而这些区 ...

  5. C# 多线程操作之异步委托

    标签: 多线程任务nullstringhtml工作 2012-06-29 23:00 1276人阅读 评论(0) 收藏 举报  分类: C/C++/C#/dotnet(126)    目录(?)[+] ...

  6. C#中的异步和多线程

    许多开发人员对异步代码和多线程以及它们的工作原理和使用方法都有错误的认识.在这里,你将了解这两个概念之间的区别,并使用c#实现它们. 我:"服务员,这是我第一次来这家餐厅.通常需要4个小时才 ...

  7. C# winform编程中多线程操作控件方法

    private void Form1_Load(object sender, EventArgs e) { Thread newthread = new Thread(new ThreadStart( ...

  8. 多线程操作(循环往listbox中添加数据)

    一.先造一个窗体,其中就开始按钮,暂停按钮,以及listbox文本框 二.当点击开始的时候,数据会无限的往listbox中加,为了防止卡住和提升效率,便造了一个新的线程来执行开始操作 namespac ...

  9. PHP中实现异步调用多线程程序代码

    本文章详细的介绍了关于PHP中实现异步调用多线程方法,下面我们以给1000个用户发送一封推荐邮件,用户输入或者导入邮件账号了提交服务器执行发送来讲述. 比如现在有一个场景,给1000个用户发送一封推荐 ...

随机推荐

  1. java中用中国网建提供的SMS短信平台发送短信

    接下来的项目需求中提到需要短信发送功能,以前没有做过,因此便在网上搜了一下.大体上说的都是有三种方法,分别是sina提供的webservice接口.短信mao和中国网建提供的SMS短信平台. 这三种方 ...

  2. activiti自定义流程之Spring整合activiti-modeler5.16实例(二):创建流程模型

    注:(1)环境搭建:activiti自定义流程之Spring整合activiti-modeler5.16实例(一):环境搭建 1.maven导包,这里就没有什么多的好说了,直接代码: <depe ...

  3. autotool相关:AC_ARG_ENABLE的用法

    你可以使用AC_ARG_ENABLE来定义一个命令行选项.这个宏接受三个参数1.flag_base2.该选项的帮助说明3.当configure带该选项运行时所执行的代码,代码中的命令行变量enable ...

  4. 学习WordPress必须知道的函数(转)

    WordPress是目前十分流行的独立博客程序,因傻瓜化安装和使用,其在网民中的应用已近乎普及.但也因为很多新入门的用户几乎对WordPress 程序没有任何了解,造成使用中碰到问题无法解决,求助也十 ...

  5. Hadoop MapReduce编程学习

    一直在搞spark,也没时间弄hadoop,不过Hadoop基本的编程我觉得我还是要会吧,看到一篇不错的文章,不过应该应用于hadoop2.0以前,因为代码中有  conf.set("map ...

  6. [实变函数]3.1 外测度 (outer measure)

    1 并不是所有的集合都可求测度. 我们的想法是先对 $\bbR^n$ 中的任一集合定义一个``外 测度'' (outer measure), 然后再加上适当的条件 (Caratheodory 条件), ...

  7. 【Java】PrettyTime

    package test; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.D ...

  8. H桥电路

    电路特点:有三极管组成4个桥的腿,中间可以使电容或是电机. 应用:直流电机的正反转控制.DC-AC逆变电源(脉冲直流变为周期交流) 关键点:同一个时刻只能对角的一对三极管导通,同侧不能一块导通,共2对 ...

  9. JAVA 匿名对象

    /* 匿名对象: 没有名字的对象 匿名对象的使用方式之一: 当对对象方法只调用一次时,我们可以用匿名对象来完成,比较简化. 匿名对象的使用方式之二: 匿名对象可以被当做实参传递 */ class Ca ...

  10. Linux查看程序端口占用情况(转载)

    From:http://www.cnblogs.com/benio/archive/2010/09/15/1826728.html 今天发现服务器上Tomcat 8080端口起不来,老提示端口已经被占 ...