IOS多线程同步问题
? ? ? ? 在多線程開發(fā)中,要注意避免的是多個(gè)線程在同一時(shí)間對(duì)某數(shù)據(jù)進(jìn)行讀或?qū)懰斐傻牟豢深A(yù)見錯(cuò)誤。因此在不同線程中需要對(duì)公共數(shù)據(jù)進(jìn)行互斥的訪問(wèn),最常見的是生產(chǎn)者與消費(fèi)者問(wèn)題。
1. 同步塊或者NSLock
? ? ? ? 同步塊或者NSLock實(shí)現(xiàn)的效果差不多,都是進(jìn)行加鎖-操作-解鎖,以此達(dá)到互斥訪問(wèn)的效果。
? ? ? ? 在一個(gè)代碼塊中進(jìn)行加鎖可以實(shí)現(xiàn)不同線程對(duì)該代碼塊的互斥訪問(wèn)。在多個(gè)代碼塊中使用同一個(gè)信號(hào)量進(jìn)行加鎖則不同代碼塊之間也能實(shí)現(xiàn)互斥訪問(wèn)。即加鎖解鎖的本質(zhì)是對(duì)信號(hào)量的原子處理。
//生產(chǎn)者-同步代碼塊,括號(hào)參數(shù)為自定義信號(hào)量 -(void)synchronizeFunc1 {@synchronized (self) {if(count < 1000) {count += 100;NSLog(@"P count is %d", count);}} } //消費(fèi)者-同步代碼塊 -(void)synchronizeFunc2 {@synchronized (self) {if(count > 0) {count -= 100;NSLog(@"C count is %d", count);}} } //生產(chǎn)者-NSLock,一個(gè)NSLock對(duì)象就是一個(gè)信號(hào)量 -(void)synchronizeFunc3 {[nsLock lock];if(count < 1000) {count += 100;NSLog(@"P count is %d", count);}[nsLock unlock]; } //消費(fèi)者-NSlock -(void)synchronizeFunc4 {[nsLock lock];if(count > 0) {count -= 100;NSLog(@"C count is %d", count);}[nsLock unlock]; }2. NSConditon
? ? ? ? 很明顯上面兩種操作中,所有的線程都是獨(dú)立運(yùn)行的,線程之間沒(méi)有任何通信或者說(shuō)協(xié)作。如果消費(fèi)者獲得了lock,但是此時(shí)count<0,那么消費(fèi)者函數(shù)將解鎖并退出,也就是說(shuō)取錢失敗。如果我們想,取消操作中發(fā)現(xiàn)count<0后,可以進(jìn)行等待生產(chǎn)者存錢,之后再取錢,這時(shí)就需要用到NSCondition了。NSCondition在NSLock的基礎(chǔ)上,多加了wait函數(shù)和signal/broadcast函數(shù),可以是獲得了信號(hào)量但是卻操作條件不足滿的線程釋放信號(hào)量進(jìn)行等待,在條件滿足之后再被喚醒繼續(xù)加鎖執(zhí)行之前的操作。
? ? ? ? 下面有一個(gè)測(cè)試的例子看wait做了什么
//2個(gè)消費(fèi)者for(int i=0; i<2; i++){NSThread* thread1 = [[NSThread alloc]initWithTarget:self selector:@selector(synchronizeFunc6) object:nil];[thread1 start];}//1個(gè)生產(chǎn)者NSThread* thread2 = [[NSThread alloc]initWithTarget:self selector:@selector(synchronizeFunc5) object:nil];[thread2 start];//生產(chǎn)者-NSConditon,一個(gè)NSConditon對(duì)象就是一個(gè)信號(hào)量 -(void)synchronizeFunc5 {[condition lock];NSLog(@"P Enter");if(count >= 1000){[condition wait];NSLog(@"P wait");}else {count += 100;NSLog(@"P count is %d", count);[condition broadcast];}[condition unlock];NSLog(@"P conditon"); } //消費(fèi)者-NSConditon -(void)synchronizeFunc6 {[condition lock];NSLog(@"C Enter");if(count <= 0){[condition wait];NSLog(@"C Wait");}else {count -= 100;NSLog(@"C count is %d", count);[condition broadcast];}[condition unlock];NSLog(@"C condition"); }程序輸出:
這篇博客,講了一些property的atomic相關(guān)的東西:
點(diǎn)擊打開鏈接
總結(jié)
以上是生活随笔為你收集整理的IOS多线程同步问题的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 2021年cisaw培训指南
- 下一篇: ios设备使用socks代理