线程同步

来源:互联网 发布:excel中mid函数数组 编辑:程序博客网 时间:2024/06/07 06:05

举例场景

例子:

  • 重庆售票窗、上海售票窗都在卖一趟飞机票
  • 问题,出现两个售票窗同一时刻卖一张票
  • 这肯定是不合理,下面说解决方式

解决方式

线程锁,我们专业点,嗯线程同步

GCD Semaphore (信号量)

示例代码

//"最后一张票,不骗你"    __block NSInteger planeTicketCount = 1;    // 创建线程锁 信号=1    dispatch_semaphore_t semaphore = hSemaphore(1);    while (1) {        if (planeTicketCount == 0) break;        dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,0), ^{            // 信号递减 == 0 就上锁 线程一直在这里等待 ,后面一个参数是等待时间            dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);            if (planeTicketCount > 0) {                // 卖掉了                planeTicketCount --;            }            // 信号递增 不等0 则唤醒还在等待此信号的线程            dispatch_semaphore_signal(semaphore);        });    }

NSLock (锁)

//"最后一张票,不骗你"    __block NSInteger planeTicketCount = 1;    // 买了一把锁    NSLock *Lock = [[NSLock alloc]init];    while (1) {        if (planeTicketCount == 0)break;        [[hGCD globalQueue]queueBlock:^{            // 锁上,不让其他线程过去了            [Lock lock];            if (planeTicketCount >0 ) {                planeTicketCount --;            }            // 解锁,其他线程可以进入此代码段了            [Lock unlock];        }];    }

@synchronized (self) 顾名思义同步

//"最后一张票,不骗你"    __block NSInteger planeTicketCount = 1;    while (1) {        if (planeTicketCount == 0)break;        [[hGCD globalQueue]queueBlock:^{            // 括起来的这一段代码 同一时间只能有一个线程执行            @synchronized (self) {                if (planeTicketCount >0 ) {                    planeTicketCount --;                }                //代码端执行完了,自动放锁            }        }];    }
0 0
原创粉丝点击