objective-c 多线程并发售票问题 NSLock 临界资源 临界区

来源:互联网 发布:看门狗低配优化补丁 编辑:程序博客网 时间:2024/09/21 09:26

////  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];                            }}


1 0