外部应该如何使用

来源:8-2 dispatch_barrier_async()函数相关面试问题

慕数据1483426

2021-08-05

我按照视频中的写法封装JK_User,但是在多线程的环境中调用JK_User并不能实现多读单写的功能。请问是我的外部调用方法不对吗?如果外部在主线程中调用的话是可以实现多读单写的,但是这样有意义吗?

//JK_User.h
@interface JK_User : NSObject
- (void)writeString:(NSString *)string;
- (NSString *)readString;
@end

//JK_User.m
#import "JK_User.h"

@implementation JK_User{
    dispatch_queue_t _concurrent;
    NSString *_name;
}

- (instancetype)init
{
    self = [super init];
    if (self) {
        _name = @"userName";
        _concurrent = dispatch_queue_create("read_write_queue", DISPATCH_QUEUE_CONCURRENT);
    }
    return self;
}

- (void)writeString:(NSString *)string{
    dispatch_barrier_async(_concurrent, ^{
        self->_name = [string copy];
        NSLog(@"%@-write:%@",[NSThread currentThread],string);
    });
}

- (NSString *)readString{
    __block NSString *result;
    dispatch_sync(_concurrent, ^{
        result = self->_name;
    });
    NSLog(@"%@-read:%@",[NSThread currentThread],result);
    return result;
}

@end

外部调用的代码

- (void)mutTest{
	//无法实现多读单写
    JK_User *user = [[JK_User alloc] init];
    
    NSThread *t_1 = [[NSThread alloc] initWithBlock:^{
        NSLog(@"1");
        NSString *temp = [user readString];
        NSLog(@"1-%@-%@",[NSThread currentThread],temp);
    }];
    [t_1 start];
    
    NSThread *t_2 = [[NSThread alloc] initWithBlock:^{
        NSLog(@"2");
        [user writeString:@"changed"];
    }];
    [t_2 start];
    
    NSThread *t_3 = [[NSThread alloc] initWithBlock:^{
        NSLog(@"3");
        NSString *temp = [user readString];
        NSLog(@"3-%@-%@",[NSThread currentThread],temp);
    }];
    [t_3 start];
    
    NSThread *t_4 = [[NSThread alloc] initWithBlock:^{
        NSLog(@"4");
        NSString *temp = [user readString];
        NSLog(@"4-%@-%@",[NSThread currentThread],temp);
    }];
    [t_4 start];
}

- (void)mainTest{
	//全部在主线程中调用的话是可以实现多读单写的
    JK_User *user = [[JK_User alloc] init];
    NSString *temp1 = [user readString];
    NSLog(@"1-%@-%@",[NSThread currentThread],temp1);
    
    NSLog(@"2");
    [user writeString:@"changed"];
    
    NSString *temp3 = [user readString];
    NSLog(@"3-%@-%@",[NSThread currentThread],temp3);
    
    NSString *temp4 = [user readString];
    NSLog(@"4-%@-%@",[NSThread currentThread],temp4);
    
}
写回答

1回答

于海

2021-08-16

多读单写是指同一时间可以有多个线程访问变量,但同一时间仅能有一个写线程执行写操作,读读可以同时进行,读写,写写要互斥进行。

0
0

资深大牛带你深度剖析ios高级面试

从BAT/TMD名企真题入手,结合源码及应用,构建完整iOS知识体系

1749 学习 · 600 问题

查看课程