美文网首页
多线程GCD控制并发量--Semaphore

多线程GCD控制并发量--Semaphore

作者: 二猪哥 | 来源:发表于2019-02-26 18:42 被阅读0次

信号量是一个整型值,有初始计数值;可以接收通知信号和等待信号。当信号量收到通知信号时,计数+1;当信号量收到等待信号时,计数-1;如果信号量为0,线程会被阻塞,直到信号量大于0,才会继续下去。

直接上代码

dispatch_queue_t workConcurrentQueue = dispatch_queue_create("cccccccc", DISPATCH_QUEUE_CONCURRENT);
    //定义一个信号量,初始化为10
    dispatch_semaphore_t semaphore1 = dispatch_semaphore_create(3);

    //同时执行100个任务
    for (int i = 0; i < 100; i++)
    {
        //当前信号量-1
        dispatch_semaphore_wait(semaphore1, DISPATCH_TIME_FOREVER);

        dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{

//        dispatch_async(workConcurrentQueue, ^{
//            NSLog(@"任务%d执行",i+1);

            NSLog(@"%@",[NSThread currentThread]);
            sleep(1);
            //当前信号量+1
            dispatch_semaphore_signal(semaphore1);
        });
        

    }

打印:

2019-02-26 18:38:42.912065+0800 练习[56654:3448246] <NSThread: 0x600000c79bc0>{number = 3, name = (null)}
2019-02-26 18:38:42.912073+0800 练习[56654:3448243] <NSThread: 0x600000c41080>{number = 5, name = (null)}
2019-02-26 18:38:42.912088+0800 练习[56654:3448244] <NSThread: 0x600000c4b1c0>{number = 4, name = (null)}
2019-02-26 18:38:43.914035+0800 练习[56654:3448244] 开始执行
2019-02-26 18:38:43.914035+0800 练习[56654:3448246] 开始执行
2019-02-26 18:38:43.914035+0800 练习[56654:3448243] 开始执行
2019-02-26 18:38:43.914436+0800 练习[56654:3448243] <NSThread: 0x600000c41080>{number = 5, name = (null)}
2019-02-26 18:38:43.914443+0800 练习[56654:3448244] <NSThread: 0x600000c4b1c0>{number = 4, name = (null)}
2019-02-26 18:38:43.914487+0800 练习[56654:3448246] <NSThread: 0x600000c79bc0>{number = 3, name = (null)}
2019-02-26 18:38:44.919246+0800 练习[56654:3448244] 开始执行
2019-02-26 18:38:44.919246+0800 练习[56654:3448243] 开始执行
2019-02-26 18:38:44.919246+0800 练习[56654:3448246] 开始执行

说明:从执行结果中可以看出,虽然将10个任务都异步加入了并发队列,但是信号量机制控制了最大线程并发数,始终是3个线程在执行任务。此外,这些任务也没有阻塞主线程。

相关文章

网友评论

      本文标题:多线程GCD控制并发量--Semaphore

      本文链接:https://www.haomeiwen.com/subject/ayjzyqtx.html