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

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


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值