美文网首页
多读单写 phtread_rwlock_t & dispatch

多读单写 phtread_rwlock_t & dispatch

作者: xxttw | 来源:发表于2023-06-16 17:59 被阅读0次
    • IO操作
    • 文件操作
    • 多读单写
    phtread_rwlock_t
    @property (nonatomic, assign) pthread_rwlock_t rwlock;
        pthread_rwlock_rdlock(&_rwlock);
        sleep(2);
        NSLog(@"%s", __func__);
        pthread_rwlock_unlock(&_rwlock);
    
        pthread_rwlock_wrlock(&_rwlock);
        sleep(1);
        NSLog(@"%s", __func__);
        pthread_rwlock_unlock(&_rwlock);
    
    - (void)dealloc {
        pthread_rwlock_destroy(&_rwlock);
    }
    
    dispatch_barrier_async
    • 异步栅栏仅对自定义并发队列(DISPATCH_QUEUE_CONCURRENT)才会有栅栏的作用
      dispatch_queue_t queue = dispatch_queue_create("myqueue",DISPATCH_QUEUE_CONCURRENT)
      如果是串行队列,或全局并发队列,等同于dispatch_async函数
      image.png
        self.queue = dispatch_queue_create("com", DISPATCH_QUEUE_CONCURRENT);
        for (int i = 0; i < 10; i++) {
            
            [self read];
            [self read];
            [self read];
            [self write];
        }
    - (void)read {
        
        dispatch_async(self.queue, ^{
            sleep(1);
            NSLog(@"read");
        });
        
    }
    
    - (void)write {
        
        dispatch_barrier_async(self.queue, ^{
            sleep(1);
            NSLog(@"write");
        });
    }
    2022-12-20 18:00:54.042267+0800 多线程-读写锁[2957:10175394] read
    2022-12-20 18:00:54.042345+0800 多线程-读写锁[2957:10175395] read
    2022-12-20 18:00:54.042381+0800 多线程-读写锁[2957:10175388] read
    2022-12-20 18:00:55.050300+0800 多线程-读写锁[2957:10175388] write
    2022-12-20 18:00:56.051883+0800 多线程-读写锁[2957:10175388] read
    2022-12-20 18:00:56.051883+0800 多线程-读写锁[2957:10175395] read
    2022-12-20 18:00:56.055010+0800 多线程-读写锁[2957:10175393] read
    2022-12-20 18:00:57.061040+0800 多线程-读写锁[2957:10175393] write
    2022-12-20 18:00:58.065408+0800 多线程-读写锁[2957:10175388] read
    2022-12-20 18:00:58.065365+0800 多线程-读写锁[2957:10175393] read
    2022-12-20 18:00:58.065458+0800 多线程-读写锁[2957:10175395] read
    2022-12-20 18:00:59.066764+0800 多线程-读写锁[2957:10175395] write
    

    dispatch_barriarr_syncdispatch_barriarr_async 的区别在于是否会阻塞当前线程
    如果是dispatch_barriarr_sync 10-15的循环会先执行, 1在同步栅栏调用结束后打印, sync会阻塞1的线程
    如果是dispatch_barrier_async 1会直接被打印, 因为1在其他线程, 10-15在子线程,async不阻塞1的线程

        self.queue = dispatch_queue_create("com", DISPATCH_QUEUE_CONCURRENT);
        
        for (int i = 0; i < 5; i++) {
            [self read];
        }
        
        [self write];
        NSLog(@"1 - %@", [NSThread currentThread]);
    
    
        for (int i = 10; i < 15; i++) {
            [self read];
        }
        
    }
    
    - (void)read {
        
        dispatch_async(self.queue, ^{
            sleep(1);
            NSLog(@"read");
        });
        
    }
    
    - (void)write {
        
        dispatch_barrier_sync(self.queue, ^{
            sleep(1);
            NSLog(@"write");
        });
    }
    
    022-12-20 18:29:02.596902+0800 多线程-读写锁[8327:10211413] read
    2022-12-20 18:29:02.599688+0800 多线程-读写锁[8327:10211422] read
    2022-12-20 18:29:02.599796+0800 多线程-读写锁[8327:10211414] read
    2022-12-20 18:29:02.599806+0800 多线程-读写锁[8327:10211416] read
    2022-12-20 18:29:02.599815+0800 多线程-读写锁[8327:10211418] read
    2022-12-20 18:29:03.601354+0800 多线程-读写锁[8327:10211171] write
    2022-12-20 18:29:03.601453+0800 多线程-读写锁[8327:10211171] 1 - <_NSMainThread: 0x600002150800>{number = 1, name = main}
    2022-12-20 18:29:04.602319+0800 多线程-读写锁[8327:10211414] read
    2022-12-20 18:29:04.602808+0800 多线程-读写锁[8327:10211422] read
    2022-12-20 18:29:04.602820+0800 多线程-读写锁[8327:10211419] read
    2022-12-20 18:29:04.602829+0800 多线程-读写锁[8327:10211413] read
    2022-12-20 18:29:04.604251+0800 多线程-读写锁[8327:10211418] read
    
    - (void)write {
        dispatch_barrier_async(self.queue, ^{
            sleep(1);
            NSLog(@"write");
        });
    }
    2022-12-20 18:30:14.218615+0800 多线程-读写锁[8556:10212848] 1 - <_NSMainThread: 0x6000034c40c0>{number = 1, name = main}
    2022-12-20 18:30:15.220370+0800 多线程-读写锁[8556:10213054] read
    2022-12-20 18:30:15.229358+0800 多线程-读写锁[8556:10213062] read
    2022-12-20 18:30:15.229418+0800 多线程-读写锁[8556:10213057] read
    2022-12-20 18:30:15.229442+0800 多线程-读写锁[8556:10213055] read
    2022-12-20 18:30:15.229430+0800 多线程-读写锁[8556:10213060] read
    2022-12-20 18:30:16.235090+0800 多线程-读写锁[8556:10213060] write
    2022-12-20 18:30:17.241020+0800 多线程-读写锁[8556:10213060] read
    2022-12-20 18:30:17.241121+0800 多线程-读写锁[8556:10213055] read
    2022-12-20 18:30:17.241140+0800 多线程-读写锁[8556:10213057] read
    2022-12-20 18:30:17.241160+0800 多线程-读写锁[8556:10213062] read
    2022-12-20 18:30:17.241178+0800 多线程-读写锁[8556:10213061] read
    

    相关文章

      网友评论

          本文标题:多读单写 phtread_rwlock_t & dispatch

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