- #import "ViewController.h"
- @interface ViewController ()
- @property (nonatomic,assign) int ticket;
- @property (nonatomic, strong) dispatch_semaphore_t semaphore;
- @property (nonatomic, strong) dispatch_semaphore_t semaphore1;
- @end
- @implementation ViewController
- - (void)viewDidLoad {
- [super viewDidLoad];
- self.semaphore = dispatch_semaphore_create(1);// 最多 1 个线程同时执行
- self.semaphore1 = dispatch_semaphore_create(5);// 最多 1 个线程同时执行
- self.ticket=50;
- // [self ticketsTest];
- for (int i = 0 ; i<20; i++) {
- [[[NSThread alloc]initWithTarget:self selector:@selector(test2) object:nil] start];
- }
- // Do any additional setup after loading the view.
- }
- -(void)test2{
- /*
- 执行 semaphore_wait 如果 semaphore1>0 semaphore1 的值就会减一 并继续往下执行
- 如果 semaphore1 <=0 线程就会休眠 直到 semaphore1 的值 > 0 再将 semaphore1 的值就会减一 并继续往下执行
- */
- dispatch_semaphore_wait(self.semaphore1, DISPATCH_TIME_FOREVER);
- sleep(2);
- NSLog(@"test");
- // 信号量的值加一
- dispatch_semaphore_signal(self.semaphore1);
- }
- -(void)saleTicket{
- dispatch_semaphore_wait(self.semaphore, DISPATCH_TIME_FOREVER);
- int ticket = self.ticket;
- sleep(.2);
- ticket--;
- self.ticket=ticket;
- NSLog(@"%d-=%@",self.ticket,[NSThread currentThread]);
- dispatch_semaphore_signal(self.semaphore);
- }
- -(void)ticketsTest{
- 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
来源: http://www.bubuko.com/infodetail-3415162.html