示例及使用细节都在代码里
#import "dispatchSemaphoreVC.h"
@interface dispatchSemaphoreVC ()
@property (strong, nonatomic) dispatch_semaphore_t ticketSema;
@property (strong, nonatomic) dispatch_semaphore_t moneySema;
@end
@implementation dispatchSemaphoreVC
- (void)viewDidLoad {
[super viewDidLoad];
self.ticketSema = dispatch_semaphore_create(1); // 初始值,线程最大并发数量1,就变成了同步执行了的效果了
self.moneySema = dispatch_semaphore_create(1);
[self concurrentMoney];
[self concurrentSaleTicket];
}
- (void)__saveMoney {
// wait 信号量的值-1,如果信号量的值小于0了,其他线程就等待
dispatch_semaphore_wait(self.ticketSema, DISPATCH_TIME_FOREVER);
[super saveMoney];
// signal 信号量的值+1
dispatch_semaphore_signal(self.ticketSema);
}
- (void)__drawMoney {
// wait 信号量的值-1,如果信号量的值小于0了,其他线程就等待
dispatch_semaphore_wait(self.ticketSema, DISPATCH_TIME_FOREVER);
[super drawMoney];
// signal 信号量的值+1
dispatch_semaphore_signal(self.ticketSema);
}
- (void)__saleTicket {
// wait 信号量的值-1,如果信号量的值小于0了,其他线程就等待
dispatch_semaphore_wait(self.moneySema, DISPATCH_TIME_FOREVER);
[super saleTicket];
// signal 信号量的值+1
dispatch_semaphore_signal(self.moneySema);
}
- (void)concurrentMoney {
dispatch_queue_t queue = dispatch_get_global_queue(0, 0);
dispatch_async(queue, ^{
for (int i = 0; i < 10; i++) {
[self __saveMoney];
}
});
dispatch_async(queue, ^{
for (int i = 0; i < 10; i++) {
[self __drawMoney];
}
});
}
- (void)concurrentSaleTicket {
dispatch_queue_t queue = dispatch_get_global_queue(0, 0);
dispatch_async(queue, ^{
for (int i = 0; i < 5; i++) {
[self __saleTicket];
}
});
dispatch_async(queue, ^{
for (int i = 0; i < 5; i++) {
[self __saleTicket];
}
});
}
@end