• lock的两种方式


    假设现在我们有100个数据项可以读写。有若干个线程,任何一个线程可能对任何一个数据项尽心读写。

    但是,如果不同的线程在对同一个数据项进行读写,就可能发生错误。需要使用lock进行控制。

    比如线程x要对数据项50进行写,那么首先他获取一个锁,如果获取不到则等待,获取到后,进行操作,然后释放锁。

    这个锁是全局的。也就是说,在线程x获取到锁后,线程y要对数据项60进行写时,是无法获取到锁的只能等待。

    (1)一个解锁方案是,创建100个锁,每个数据项一个。当对某个数据项进行写入时,获取对应的锁。然而,当节点有上百万上亿个呢?

    (2)此时,系统应该系统一个锁接口lock(data, para)。 data参数表示要锁定的数据,para表示访问模式,比如是共享锁还是排他锁。这样,当任何一个线程要写数据abc时,只需调用lock(abc, para) 来获取锁。此时,其他线程访问数据def可以调用lock(def,para)获取另外的锁。

    (3)对于文件操作,系统已经提供了这样的接口,  http://man7.org/linux/man-pages/man2/flock.2.html

     #include <sys/file.h>
    
    int flock(int fd, int operation);

    (4)对于上面提到的数据项,系统应该提供了锁内存的接口。

    (5) 还有一种锁方式是针对cpu的,比如 sloppy counter ,参考 http://pages.cs.wisc.edu/~remzi/OSTEP/threads-locks-usage.pdf
    每个cpu有一个局部计数器,任何一个线程要操作计数器时,只操作运行他那个cpu的的计数器。局部计数器的计数会定期被放入全局计数器。
        这种实现的本质是加锁、计数操作、和解锁是一个原子操作,确保在一个cpu上完成。

     
  • 相关阅读:
    创建者模式 -- 单例模式(反射&序列化)
    设计模式(总)
    并不是static final 修饰的变量都是编译期常量
    内部类和静态内部类的加载顺序
    所有的Java虚拟机必须实现在每个类或接口被Java程序 “ 首次主动使用 ” 时才初始化他们
    24 shell 管道命令与过滤器
    26 bash shell中的信号
    25 Linux中的信号
    23 shell 进程替换
    22 shell组命令与子进程
  • 原文地址:https://www.cnblogs.com/bettersky/p/7141426.html
Copyright © 2020-2023  润新知