IOS多线程安全-读者写者问题

By | 2015年5月24日

多线程安全中,所谓读者写者:一个可变的对象,一个线程正对它修改,这时另个线程也过来了想修改它,同时进行吗?肯定不可以。

所以在多线程安全中,为了解决读者写者的线程安全问题,需要使用dispatch_barrier_async来保护可变对象:

var myArray :[Int] = []
func addArray(i:Int){
    //可变的数组,不是线程安全的,多个线程过来,数据就不安全了!
    myArray.append(i)
}
@IBAction func btnClick2(sender: AnyObject) {

    //保证有且只有个一线程运行addArray方法,保证数组的数据安全
    dispatch_barrier_async(dispatch_queue_create("com.thread", DISPATCH_QUEUE_CONCURRENT)){
        self.addArray(4)
    }
}

dispatch_barrier_async是一个阻塞方式来保护里面的操作,有且只有一个线程运行里面的代码,不会允许2个线程同时运行addArray方法。

需要注意的,必须使用自定义队列。