外部应该如何使用
来源: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
多读单写是指同一时间可以有多个线程访问变量,但同一时间仅能有一个写线程执行写操作,读读可以同时进行,读写,写写要互斥进行。
00
相似问题
外部应该如何使用
回答 1
事件响应 与 视图响应的区别?该如何区分
回答 1