b2科目四模拟试题多少题驾考考爆了怎么补救
b2科目四模拟试题多少题 驾考考爆了怎么补救

无锁编程_程序员,伟大的把人们从繁琐的事物中解脱出来

电脑杂谈  发布时间:2016-04-22 11:12:31  来源:网络整理

你是否正在寻找关于无锁编程的内容?让我把最有用的东西奉献给你:

关于无锁编程

Lock-free 算法通常比基于锁的算法要好:

  • 从其定义来看,它们是 wait-free 的,可以确保线程永远不会阻塞。
  • 状态转变是原子性的,以至于在任何点失败都不会恶化数据结构。
  • 因为线程永远不会阻塞,所以当同步的细粒度是单一原子写或比较交换时,它们通常可以带来更高的吞吐量。
  • 在某些情况下,lock-free 算法会有更少的同步写操作(比如 Interlocked 操作),因此纯粹从性能来看,它可能更便宜。
  • 但是 lock-freedom 并不是万能药。下面是一些很明显的不利因素:

  • 乐观的并发使用会对 hot data structures 导致 livelock,。
  • 代码需要大量困难的测试。通常其正确性取决于对目标机器内存模型的正确解释。
  • 基于众多原因,lock-free 代码很难编写和维护。
  • 前一篇文章多核系统中三种典型锁竞争的加速比分析讲过了三种典型锁竞争情况下的加速比情况,特别是分布式锁竞争的加速比和CPU核数成正比,有很好的加速比性能。由于近些年在学术界中,无锁编程属于研究热点。那么使用无锁编程是不是可以取得更好的加速比性能呢?或者说无锁编程是不是更适合多核CPU系统呢?

    无锁编程主要是使用原子操作替代锁来实现对共享资源的访问保护,举个例子,要对某个整数变量进行加1操作的话,用锁保护操作的代码如下:

    int a = 0;

    Lock();

    a+= 1;

    Unlock();

    如果对上述代码反编译可以发现 a+=1;被翻译成了以下三条汇编指令:

    mov eax,dword ptr [a]

    add eax,1

    mov dword ptr [a],eax

    如果在单核系统中,由于在上述三条指令的任何一条执行完后都可能发生任务切换,比如执行完第1条指令后就发生了任务切换,这时如果有其他任务来对a进行操作的话,当任务切换回来后,将继续对a进行操作,很可能出现不可预测的结果,因此上述三条指令必须使用锁来保护,以使这段时间内其他任务无法对a进行操作。

    需要注意的是,在多核系统中,因为多个CPU核在物理上是并行的,可能发生同时写的现象;所以必须保证一个CPU核在对共享内存进行写操作时,其他CPU核不能写这块内存。因此在多核系统中和单核有区别,即使只有一条指令,也需要要加锁保护。

    如果使用原子操作来实现上述加1操作的话,例如使用VC里的InterlockedIncrement来操作的话,那么对a的加1操作需要以下语句

    InterlockedIncrement (&a);

    这条语句最终的实际加1操作会被翻译成以下一条带lock前缀的汇编指令:

    lock xadd dword ptr [ecx],eax

    使用原子操作时,在进行实际的写操作时,使用了lock指令,这样就可以阻止其他任务写这块内存,避免出现数据竞争现象。原子操作速度比锁快,一般要快一倍以上。

    使用lock前缀的指令实际上在系统中是使用了内存栅障(memory barrier),当原子操作在进行时,其他任务都不能对内存操作,会影响其他任务的执行。因此这种原子操作实际上属于一种激烈竞争的锁,不过由于它的操作时间很快,因此可以看成是一种极细粒度锁。

    在无锁(Lock-free)编程环境中,主要使用的原子操作为CAS(Compare and Swap)操作,在VC里对应的操作为;

    由于原子操作速度比锁快,其实相比于普通锁操作,相当于加锁解锁时间

    以上就是关于无锁编程的全部内容,相信你一定会非常满意。


    本文来自电脑杂谈,转载请注明本文网址:
    http://www.pc-fly.com/a/shouji/article-2549-1.html

      相关阅读
        发表评论  请自觉遵守互联网相关的政策法规,严禁发布、暴力、反动的言论

        热点图片
        拼命载入中...