美文网首页
多线程mark

多线程mark

作者: 颓废小姐与沉思先生 | 来源:发表于2016-09-07 16:20 被阅读0次

    dispatch_semaphore_signal

    dispatch_semaphore_signal是发送一个信号,自然会让信号总量加1,dispatch_semaphore_wait等待信号,当信号总量少于0的时候就会一直等待,否则就可以正常的执行,并让信号总量-1,根据这样的原理,我们便可以快速的创建一个并发控制。

    dispatch_group_t group = dispatch_group_create();

    dispatch_semaphore_t semaphore = dispatch_semaphore_create(10);//收到10个就触发执行

    dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);

    for (int i = 0; i < 100; i++)

    {

    dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);

    dispatch_group_async(group, queue, ^{

    NSLog(@"%i",i);

    sleep(2);

    dispatch_semaphore_signal(semaphore);

    });

    }

    dispatch_group_wait(group, DISPATCH_TIME_FOREVER);

    简单的介绍一下这一段代码,创建了一个初使值为10的semaphore,每一次for循环都会创建一个新的线程,线程结束的时候会发送一个信号,线程创建之前会信号等待,所以当同时创建了10个线程之后,for循环就会阻塞,等待有线程结束之后会增加一个信号才继续执行,如此就形成了对并发的控制,如上就是一个并发数为10的一个线程队列。

    关于信号量,一般可以用停车来比喻。

    停车场剩余4个车位,那么即使同时来了四辆车也能停的下。如果此时来了五辆车,那么就有一辆需要等待。

    信号量的值就相当于剩余车位的数目,dispatch_semaphore_wait函数就相当于来了一辆车,dispatch_semaphore_signal

    就相当于走了一辆车。停车位的剩余数目在初始化的时候就已经指明了(dispatch_semaphore_create(long value)),

    调用一次dispatch_semaphore_signal,剩余的车位就增加一个;调用一次dispatch_semaphore_wait剩余车位就减少一个;

    当剩余车位为0时,再来车(即调用dispatch_semaphore_wait)就只能等待。有可能同时有几辆车等待一个停车位。有些车主

    没有耐心,给自己设定了一段等待时间,这段时间内等不到停车位就走了,如果等到了就开进去停车。而有些车主就像把车停在这,

    所以就一直等下去。

    http://www.cnblogs.com/snailHL/p/3906112.html

    相关文章

      网友评论

          本文标题:多线程mark

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