//
// main.m
// testProjectCmdLine
//
// Created by qiao.zhiguang on 14/11/24.
// Copyright (c) 2014年 cloudacc. All rights reserved.
//
#import <Foundation/Foundation.h>
// 临界资源:多线程并发访问的 全局变量
// 临界区: 线程中访问临界资源的 代码块
int ticketCount = 20;//总票数 (临界资源)
NSLock * ticketLock; // 临界资源(票)锁
void ticketSellor(int sellorIndex);//售票员
int main(int argc,const char * argv[]) {
@autoreleasepool {
// insert code here...
ticketLock = [[NSLock alloc]init];
dispatch_queue_t concurrentQueue =dispatch_queue_create(NULL,DISPATCH_QUEUE_CONCURRENT);
for (int i =1; i <=5; i++) {// 提交5个并发售票线程
dispatch_async(concurrentQueue, ^{
ticketSellor(i);//并发售票
});
}
}
while (YES) {
sleep(5);//每五秒检查一次看是否已经卖完
[ticketLock lock];
//************************************** <临界区>
if (ticketCount ==0) {
NSLog(@"票已经售完,程序关闭");
return0;
}
//************************************** <临界区/>
[ticketLock unlock];
}
}
void ticketSellor(int sellorIndex){
while (YES) {
sleep(rand()%6+1);// 等待购票人来购票
NSLog(@"售票员 %d等待 临界资源 ...",sellorIndex);
[ticketLock lock];
//************************************** <临界区>
if (ticketCount>0) {
NSLog(@"售票员 %d正在 出售第 %d 张票 ...",sellorIndex,ticketCount);
ticketCount --;
}else{
NSLog(@"售票员 %d发现票已经售完,等待...",sellorIndex);
}
//************************************** <临界区/>
[ticketLock unlock];
}
}
objective-c 多线程并发售票问题 NSLock 临界资源 临界区
最新推荐文章于 2020-11-30 18:16:04 发布