zoukankan      html  css  js  c++  java
  • atomic是绝对的线程安全么?为什么?如果不是,那应该如何实现?

    atomic不是绝对的线程安全。atomic的本意是指属性的存取方法是线程安全的,并不保证整个对象是线程安全的

        @property (atomic, assign) int intA;

        

        //线程A

        for (int i = 0; i < 10000; i ++)

        {

            self.intA = self.intA + 1;

            NSLog(@"Thread A: %d ", self.intA);

        }

        

        //线程B

        for (int i = 0; i < 10000; i ++)

        {

            self.intA = self.intA + 1;

            NSLog(@"Thread B: %d ", self.intA);

        }

    self.intA 是原子操作,但是self.intA = self.intA + 1这个表达式并不是原子操作。
    所以线程是不安全的。
    threadA 在执行表达式 self.intA之后 self.intA = self.intA + 1;并没有执行完毕
    此时threadB 执行self.intA = self.intA + 1;
    再回到threadA时,self.intA的数值就被更新了;所以仅仅使用atomic并不能保证线程安全。

    需要用互斥锁来保证线程安全性。

  • 相关阅读:
    ccf I’m stuck!
    ccf 最大的矩形
    ccf ISBN号码
    ccf 出现次数最多的数
    ccf 相反数
    BestCoder Round #33
    15年3月CCF真题5-最小花费
    15年3月CCF真题4-网络延时
    15年3月CCF真题3-节日
    15年3月CCF真题2-数字排序
  • 原文地址:https://www.cnblogs.com/huangzs/p/10533135.html
Copyright © 2011-2022 走看看