iosGCD安全執行緒之資源共用

來源:互聯網
上載者:User

iosGCD安全執行緒之資源共用

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

 

//

// 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


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

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.