• dispatch_queue_create("com.biostime.xxx", DISPATCH_QUEUE_SERIAL)的陷阱


    代码

    for(int i =0;i<10;i++)
        {
            NSLog(@"i=%d",i);
            dispatch_queue_t mySerialQueue = dispatch_queue_create("com.biostime.xxx", DISPATCH_QUEUE_SERIAL);
            __block int d = i;
            dispatch_async(mySerialQueue, ^{
                NSRunLoop *loop = [NSRunLoop currentRunLoop];
                NSLog(@"%p excute1 i = %d d=%d",loop,i,d);
                d=9;
                NSLog(@"%p excute2 i = %d d=%d",loop,i,d);
            });
            NSLog(@"i=%d",i);
        }

    =============

    2015-05-29 14:38:49.322 GCDDemo[8558:405173] operation begin
    2015-05-29 14:38:49.322 GCDDemo[8558:405173] for begin 0
    2015-05-29 14:38:49.322 GCDDemo[8558:405173] mySerialQueue 0x7fb0b051d490
    2015-05-29 14:38:49.322 GCDDemo[8558:405173] for end 0
    2015-05-29 14:38:49.322 GCDDemo[8558:405173] for begin 1
    2015-05-29 14:38:49.322 GCDDemo[8558:405173] mySerialQueue 0x7fb0b05835e0
    2015-05-29 14:38:49.322 GCDDemo[8558:405173] for end 1
    2015-05-29 14:38:49.322 GCDDemo[8558:405173] for begin 2
    2015-05-29 14:38:49.323 GCDDemo[8558:405173] mySerialQueue 0x7fb0b05858b0
    2015-05-29 14:38:49.323 GCDDemo[8558:405173] for end 2
    2015-05-29 14:38:49.323 GCDDemo[8558:405173] for begin 3
    2015-05-29 14:38:49.323 GCDDemo[8558:405208] <NSThread: 0x7fb0b07136e0>{number = 2, name = (null)} === begin
    2015-05-29 14:38:49.323 GCDDemo[8558:405209] <NSThread: 0x7fb0b0711f50>{number = 3, name = (null)} === begin
    2015-05-29 14:38:49.323 GCDDemo[8558:405207] <NSThread: 0x7fb0b057bde0>{number = 4, name = (null)} === begin
    2015-05-29 14:38:49.323 GCDDemo[8558:405173] mySerialQueue 0x7fb0b0509480
    2015-05-29 14:38:49.323 GCDDemo[8558:405173] for end 3
    2015-05-29 14:38:49.323 GCDDemo[8558:405173] for begin 4
    2015-05-29 14:38:49.323 GCDDemo[8558:405173] mySerialQueue 0x7fb0b0516280
    2015-05-29 14:38:49.323 GCDDemo[8558:405173] for end 4
    2015-05-29 14:38:49.323 GCDDemo[8558:405173] for begin 5
    2015-05-29 14:38:49.323 GCDDemo[8558:405215] <NSThread: 0x7fb0b0627e90>{number = 5, name = (null)} === begin
    2015-05-29 14:38:49.323 GCDDemo[8558:405216] <NSThread: 0x7fb0b0506f70>{number = 6, name = (null)} === begin
    2015-05-29 14:38:49.337 GCDDemo[8558:405173] mySerialQueue 0x7fb0b0610000
    2015-05-29 14:38:49.337 GCDDemo[8558:405173] for end 5
    2015-05-29 14:38:49.337 GCDDemo[8558:405173] for begin 6
    2015-05-29 14:38:49.337 GCDDemo[8558:405173] mySerialQueue 0x7fb0b0623fa0
    2015-05-29 14:38:49.337 GCDDemo[8558:405173] for end 6
    2015-05-29 14:38:49.337 GCDDemo[8558:405173] for begin 7
    2015-05-29 14:38:49.337 GCDDemo[8558:405173] mySerialQueue 0x7fb0b0612e10
    2015-05-29 14:38:49.337 GCDDemo[8558:405173] for end 7
    2015-05-29 14:38:49.337 GCDDemo[8558:405173] for begin 8
    2015-05-29 14:38:49.338 GCDDemo[8558:405173] mySerialQueue 0x7fb0b062a590
    2015-05-29 14:38:49.338 GCDDemo[8558:405173] for end 8
    2015-05-29 14:38:49.338 GCDDemo[8558:405173] for begin 9
    2015-05-29 14:38:49.338 GCDDemo[8558:405217] <NSThread: 0x7fb0b050bbd0>{number = 7, name = (null)} === begin
    2015-05-29 14:38:49.338 GCDDemo[8558:405173] mySerialQueue 0x7fb0b0626860
    2015-05-29 14:38:49.338 GCDDemo[8558:405173] for end 9
    2015-05-29 14:38:49.338 GCDDemo[8558:405218] <NSThread: 0x7fb0b0502770>{number = 8, name = (null)} === begin
    2015-05-29 14:38:49.338 GCDDemo[8558:405173] operation end
    2015-05-29 14:38:49.338 GCDDemo[8558:405219] <NSThread: 0x7fb0b050e2b0>{number = 9, name = (null)} === begin
    2015-05-29 14:38:49.338 GCDDemo[8558:405220] <NSThread: 0x7fb0b05132e0>{number = 10, name = (null)} === begin
    2015-05-29 14:38:49.339 GCDDemo[8558:405221] <NSThread: 0x7fb0b04297c0>{number = 11, name = (null)} === begin
    2015-05-29 14:38:51.326 GCDDemo[8558:405208] <NSThread: 0x7fb0b07136e0>{number = 2, name = (null)} === end
    2015-05-29 14:38:51.326 GCDDemo[8558:405209] <NSThread: 0x7fb0b0711f50>{number = 3, name = (null)} === end
    2015-05-29 14:38:51.326 GCDDemo[8558:405207] <NSThread: 0x7fb0b057bde0>{number = 4, name = (null)} === end
    2015-05-29 14:38:51.339 GCDDemo[8558:405215] <NSThread: 0x7fb0b0627e90>{number = 5, name = (null)} === end
    2015-05-29 14:38:51.339 GCDDemo[8558:405216] <NSThread: 0x7fb0b0506f70>{number = 6, name = (null)} === end
    2015-05-29 14:38:51.343 GCDDemo[8558:405217] <NSThread: 0x7fb0b050bbd0>{number = 7, name = (null)} === end
    2015-05-29 14:38:51.343 GCDDemo[8558:405220] <NSThread: 0x7fb0b05132e0>{number = 10, name = (null)} === end
    2015-05-29 14:38:51.343 GCDDemo[8558:405218] <NSThread: 0x7fb0b0502770>{number = 8, name = (null)} === end
    2015-05-29 14:38:51.343 GCDDemo[8558:405221] <NSThread: 0x7fb0b04297c0>{number = 11, name = (null)} === end
    2015-05-29 14:38:51.344 GCDDemo[8558:405219] <NSThread: 0x7fb0b050e2b0>{number = 9, name = (null)} === end
     解析:

    dispatch_queue_create,用DISPATCH_QUEUE_SERIAL参数创建的是串行队列。那么,只要id相同,返回的都是同一个queue吗?

    答案是,错误。

    从日志中可以看到,系统生成的10个子线程来执行任务。所以,10个block仍然是并行执行。

    label的作用,文档中指出,仅仅为了在debug,instrument,crash report中进行线程标识。

    所以,label并不是线程的unique id,而是可以多个线程共用同一个id。

     请不要被label所误导。

  • 相关阅读:
    删除所有空白列 cat yum.log | awk '{$1=$2=$3=$4=null;print $0}'>>yum.log1 sed ‘s/[ ]*$//g' 删除所有空格 sed -i s/[[:space:]]//g yum.log
    make clean 清除之前编译的可执行文件及配置文件。 make distclean 清除所有生成的文件。
    ipmitool -I lanplus -H 10.1.81.90 -U admin -P admin mc reset cold
    netperf对比
    iozone
    CentOS 7 vs. CentOS 8 版本差异大比拼
    seajs模块化jQuery与jQuery插件【转】
    教你怎么写jQuery的插件
    Jquery特效之=》仿京东多条件筛选特效
    sql FOR XML PATH('')
  • 原文地址:https://www.cnblogs.com/so-magic/p/4529388.html
Copyright © 2020-2023  润新知