你好,歡迎來到IOS教程網

 Ios教程網 >> IOS編程開發 >> IOS開發綜合 >> iosGCD線程安全之資源共享

iosGCD線程安全之資源共享

編輯:IOS開發綜合

很神奇的方式,加鎖。讓你們一個個通過,不要急,後面的排隊,買饅頭,唉,那個誰,叫你別急嘛,你看看你。

 

//

// ViewController.m

// 線程安全

//

// Created by wangqian on 15/4/11.

// Copyright (c) 2015年 wangqian. All rights reserved.

//

 

#import "ViewController.h"

 

@interface ViewController ()

 

 

@property(nonatomic,assign)NSUInteger ticketNumber;

 

 

@property(nonatomic,retain)NSThread *thread1;

 

@property(nonatomic,retain)NSThread *thread2;

 

 

@property(nonatomic,retain)NSThread *thread3;

 

 

//鎖

@property(nonatomic,retain)NSLock *lock;

 

 

@end

 

@implementation ViewController

 

- (void)viewDidLoad {

[super viewDidLoad];

 

//線程安全

//在多線程中,經常會有多個線程需要訪問或者修改同一個資源,如果不做處理,則多個線程訪問或修改該資源時,有可能出現問題。

 

//一個資源在一個時間內,只能由一個線程操作。

 

//賣饅頭,有多個線程同時賣饅頭

 

//設置初始饅頭

self.ticketNumber = 50;

 

 

//創建鎖資源,創建一把鎖

self.lock = [[NSLock alloc]init];

 

 

self.thread1 = [[NSThread alloc]initWithTarget:self selector:@selector(sellTickets:) object:@"線程a賣饅頭"];

 

[self.thread1 setName:@"服務員a"];

 

 

self.thread2 = [[NSThread alloc]initWithTarget:self selector:@selector(sellTickets:) object:@"線程b賣饅頭"];

[self.thread2 setName:@"服務員b"];

 

 

 

self.thread3 = [[NSThread alloc]initWithTarget:self selector:@selector(sellTickets:) object:@"線程c賣饅頭"];

 

 

[self.thread3 setName:@"服務員c"];

 

 

}

 

 

-(void)sellTickets:(id)obj

{

//多個線程訪問或者修改同一個資源時,應該對該資源進行保護(加鎖)

// 加鎖注意: 鎖影響的區域應該足夠小。

// 臨界區 : 共享資源的使用代碼區域。

// 加鎖優點 : 保護共享資源

// 缺點 : 消耗大量的CPU資源。

while (true) {

 

//比第二種方法方便 非常的神奇 非常簡單 只要一句話搞定

//加互斥鎖,保證在一段時間內,只能由一個線程使用共享資源

@synchronized(self)

{

if (self.ticketNumber >0) {//數量大於0 就賣饅頭

self.ticketNumber -= 1;

NSThread *thread = [NSThread currentThread];

NSLog(@"obj = %@,%@ 賣了一個饅頭,還剩%ld個饅頭",obj,[thread name],self.ticketNumber);

}else

{

//退出當前線程

[NSThread exit];

}

}

}

}

 

 

-(void)sellTickets2:(id)obj

{

 

 

while (true) {

[self.lock lock];//加鎖

if (self.ticketNumber >0) {//票數大於0 就賣票

 

//票數減1

self.ticketNumber -=1;

 

 

NSThread *thread = [NSThread currentThread];

 

 

NSLog(@"obj = %@,%@ 賣了一個饅頭,還剩%ld個饅頭",obj,[thread name],self.ticketNumber);

 

}else

{

 

 

//退出當前線程

[NSThread exit];

 

}

[self.lock unlock];//解鎖

 

 

 

}

 

 

}

 

 

//用戶點擊開始賣饅頭

-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event

{

 

 

[self.thread1 start];

 

[self.thread2 start];

 

 

[self.thread3 start];

 

}

 

 

@end

\

\

\

今天三更了,就到這裡了,大家晚安。

  1. 上一頁:
  2. 下一頁:
蘋果刷機越獄教程| IOS教程問題解答| IOS技巧綜合| IOS7技巧| IOS8教程
Copyright © Ios教程網 All Rights Reserved