彼德森(Peterson)算法在多线程环境的实际应用与并发问题的解决(i++)

这是一篇关于简单情况下进行并发控制的文章,核心是彼德森算法,还有一些编程实现方面的小技巧,希望对浏览到的人提供帮助。

 

并发是os中最常见的问题之一,在早期,人们尝试使用纯算法的方法在软件层面进行实现,但这种方案由于不具备普适性,而且不够高效,后续的研究者采用软硬件结合的方式进行设计。但早期的方法仍然对我们有启发的意义。

这里简单的说明一下彼德森算法:(这位博主讲的不错,我这里copy一下)

链接:彼德森算法详解

 

当你看完上面这篇博文以后,你应该了解了彼德森算法的原理,但我发现在这方面,大家都没有给出很好的算法实现或模拟过程,所以这里我给出该算法在两个线程下的真实模拟过程:

用最为简单的 i++; 操作为例 (至于我为什么要举这个例子,可以看我的另一篇博文:i++原子性详解

我们给定一个大数NN,执行这样的操作:

for (int j = 0; j < NN; ++j) {

        i++;

    }

如果是单线程条件下,这是完全没有问题的。但是我们开两个线程时,会导致一些严重的后果,比如,发生上下文切换,(如果看完了我的另一篇文章,你应该理解这里,链接:i++原子性详解),导致i的运行结果和我们的预期不一样。此时就需要加锁控制,锁的实现为彼德森算法。

小技巧:彼德森算法使用0,1变量,我们可以通过对线程进行命名0和1的方式,再在线程内部将其从cha

  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值