NSThread - 4

首先参考:http://www.tuicool.com/articles/nQVrMv

上一篇了解到了利用属性声明关键字atomic原子性可以阻止线程并行操作的问题,但是究竟能不能解决上面的问题呢?

#import "LBThreadSecAtomViewController.h"

@interface LBThreadSecAtomViewController ()

@property(atomic,assign) int leftTicketsCount;

@property(nonatomic,strong)NSThread *thread1;
@property(nonatomic,strong)NSThread *thread2;
@property(nonatomic,strong)NSThread *thread3;

@end

@implementation LBThreadSecAtomViewController

- (void)viewDidLoad
{
    [super viewDidLoad];
    
    self.leftTicketsCount = 10;
    
    self.thread1 = [[NSThread alloc] initWithTarget:self selector:@selector(sellTickets) object:nil];
    
    self.thread1.name = @"售票员A";
    
    
    self.thread2 = [[NSThread alloc] initWithTarget:self selector:@selector(sellTickets) object:nil];
    
    self.thread2.name = @"售票员B";
    
    
    self.thread3 = [[NSThread alloc] initWithTarget:self selector:@selector(sellTickets) object:nil];
    
    self.thread3.name = @"售票员C";
    
}

- (void)sellTickets
{
    while (1)
    {
        
        if (self.leftTicketsCount > 0)
        {
            [NSThread sleepForTimeInterval:0.002];
            
            self.leftTicketsCount = self.leftTicketsCount - 1;
            
            NSThread* current = [NSThread currentThread];
            NSLog(@"%@--卖了一张票,还剩余%d张票",current,self.leftTicketsCount);
            
        }
        else
        {
            [NSThread exit];
        }
    }
}

- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event
{
    [self.thread1 start];
    
    [self.thread2 start];
    
    [self.thread3 start];
}

@end

注意到,操作的票数属性变量声明为atomic:

@property(atomic,assign) int leftTicketsCount;

运行结果:


原来,在第一次读取的时候没能阻止并发的读取造成的资源公用问题,但是在第一次操作后的其余操作就会达到加锁的效果。

那该怎么解决?  待续...


补充还可以通过同步操作来限制对资源的不当读取代替锁等等其他好的方法。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值