精华内容
下载资源
问答
  • linux无锁化编程

    万次阅读 2019-09-13 10:24:44
    muduo库中使用了几个linux无锁编程接口,这些函数在多线程下操作时无需加锁也能实现原子操作,而且加锁会影响性能。 __sync_val_compare_and_swap(type *ptr, type oldval, type newval, ...) 如果*ptr == oldval,就...

             muduo库中使用了几个linux无锁编程接口,这些函数在多线程下操作时无需加锁也能实现原子操作,而且加锁会影响性能。
    __sync_val_compare_and_swap(type *ptr, type oldval,  type newval, ...)   如果*ptr == oldval,就将newval写入*ptr
    __sync_fetch_and_add( &global_int, 1)   先fetch(获得),然后自加,返回的是自加以前的值
    __sync_lock_test_and_set(type *ptr, type value, ...)    将*ptr设为value并返回*ptr操作之前的值

    #include <stdio.h>
    #include <pthread.h>
    #include <unistd.h>
     
    int sum = 0;
    
    /*void* adder1(void *p)
    {
        for(int i = 0; i < 1000000; i++)  // 百万次
        {
            sum++;
        }
     
        return NULL;
    }*/
     
    /*void* adder2(void *p)
    {
        int old = sum;
        for(int i = 0; i < 1000000; i++)  // 百万次
        {
            while(!__sync_bool_compare_and_swap(&sum, old, old + 1))  // 如果old等于sum, 就把old+1写入sum
            {
               old = sum; // 更新old
            }
        }
     
        return NULL;
    }*/
    
    void* adder3(void *p)
    {
        for(int i = 0; i < 1000000; i++)  // 百万次
        {
            __sync_fetch_and_add(&sum,1);      
        }
     
        return NULL;
    }
    
    int main()
    {
        pthread_t threads[10];
        for(int i = 0;i < 10; i++)
        {
            pthread_create(&threads[i], NULL, adder3, NULL);
        }
    	
        for(int i = 0; i < 10; i++)
        {
            pthread_join(threads[i], NULL);
        }
     
        printf("sum is %d\n",sum);
    
        return 0;
    }
    

    addr1结果不是我们预期的,addr2和addr3是我们预期的(10000000),编译要加上选项-lpthread -march=nocona -mtune=generic

     

    参考地址:https://blog.csdn.net/stpeace/article/details/81150393

                      https://blog.csdn.net/hzhsan/article/details/25124901

    展开全文
  • java无锁化编程一:目录 假设我们用netty做服务,当接受到网络传输的码流,我们通过某种手段将这种传输数据解析成了熟悉的pojo,那这些pojo该如何进一步处理? 比如游戏中的抢购、场景业务等,对处理那种高并发的...

    java无锁化编程一:目录

    假设我们用netty做服务,当接受到网络传输的码流,我们通过某种手段将这种传输数据解析成了熟悉的pojo,那这些pojo该如何进一步处理?

    比如游戏中的抢购、场景业务等,对处理那种高并发的业务场景,如何保证数据的一致性?

     

    1.悲观锁和乐观锁

    悲观锁和乐观锁这种,大家立即会联想到数据库读写。但是我们仍然可以尝试的在获取对象锁上理解。

    没错,锁技术很慢。

     

    2.读写分离,读写锁

     

    3.MVCC,我曾尝试着用java来实现类似数据库的多版本并发控制,后面具体详说。

     

    4.actor模型的引入

    java版本的actor,共享线程池,使用cas,实现同一时刻只有单线程访问,同时更高的提升了线程池的利用率。

     

    5.无锁化编程思想:像闪电一样的disruptor

    这种ringbuffer环形数组解决了队列的头尾指针和大小变量等冲突,而唯一需要关心的,就是多个生产者写入ringBuffer的场景,

    这个要仔细说。

    展开全文
  • 16.无锁化编程有哪些常见方法

    千次阅读 2018-04-08 16:04:51
    无锁化编程有哪些常见方法?· 针对计数器,可以使用原子加· 只有一个生产者和一个消费者,那么就可以做到免锁访问环形缓冲区(Ring Buffer)多个线程也不怕,利用queue去处理。(并发转成单线程)· RCU(Read-...


    无锁化编程有哪些常见方法?

    ·        针对计数器,可以使用原子加

    ·        只有一个生产者和一个消费者,那么就可以做到免锁访问环形缓冲区(Ring Buffer)多个线程也不怕,利用queue去处理。(并发转成单线程)

    ·        RCU(Read-Copy-Update),新旧副本切换机制,对于旧副本可以采用延迟释放的做法

    ·        CAS(Compare-and-Swap),如无锁栈,无锁队列等待(先做,发生改变,再回滚)

     

     

    A 这方法虽然不太好,但是常见

    B Producer Consumer Queue就是这个,到处都是(项目的异步优化其实也是)

    C linux kernel里面大量使用

    D 本质上其实就是乐观锁,操作起来很困难。单生产者多消费者或者多生产者单消费者的情况下比较常见,也不容易遇到ABA问题。

     

    展开全文
  • 知道这些东西是理解和设计无锁化编程算法的基础。 下面的东西整理自网络。先感谢大家的分享! __sync_fetch_and_add系列的命令,发现这个系列命令讲的最好的一篇文章,英文好的同学可以直接去看原文。...

    linux支持的哪些操作是具有原子特性的?知道这些东西是理解和设计无锁化编程算法的基础。

    下面的东西整理自网络。先感谢大家的分享!

     

    __sync_fetch_and_add系列的命令,发现这个系列命令讲的最好的一篇文章,英文好的同学可以直接去看原文。Multithreaded simple data type access and atomic variables

    __sync_fetch_and_add系列一共有十二个函数,有加/减/与/或/异或/等函数的原子性操作函数,__sync_fetch_and_add,顾名思义,先fetch,然后自加,返回的是自加以前的值。以count = 4为例,调用__sync_fetch_and_add(&count,1),之后,返回值是4,然后,count变成了5.
    有__sync_fetch_and_add,自然也就有__sync_add_and_fetch,呵呵这个的意思就很清楚了,先自加,在返回。他们哥俩的关系与i++和++i的关系是一样的。被谭浩强他老人家收过保护费的都会清楚了。
    有了这个宝贝函数,我们就有新的解决办法了。对于多线程对全局变量进行自加,我们就再也不用理线程锁了。下面这行代码,和上面被pthread_mutex保护的那行代码作用是一样的,而且也是线程安全的。

    __sync_fetch_and_add( &global_int, 1 );
    下面是这群函数的全家福,大家看名字就知道是这些函数是干啥的了。

    在用gcc编译的时候要加上选项 -march=i686

    // sam:在我的服务器上,发现不加都可以。


    type __sync_fetch_and_add (type *ptr, type value);
    type __sync_fetch_and_sub (type *ptr, type value);
    type __sync_fetch_and_or (type *ptr, type value);
    type __sync_fetch_and_and (type *ptr, type value);
    type __sync_fetch_and_xor (type *ptr, type value);
    type __sync_fetch_and_nand (type *ptr, type value);
    type __sync_add_and_fetch (type *ptr, type value);
    type __sync_sub_and_fetch (type *ptr, type value);
    type __sync_or_and_fetch (type *ptr, type value);
    type __sync_and_and_fetch (type *ptr, type value);
    type __sync_xor_and_fetch (type *ptr, type value);
    type __sync_nand_and_fetch (type *ptr, type value);

     

    // sam:很纳闷为什么后边要写省略号,是不是还有不需要我们关心的参数?用的时候不需要传参数?下面这两个函数正是哥想要的啦,可以轻松实现互斥锁的功能。

    bool __sync_bool_compare_and_swap (type*ptr, type oldval, type newval, ...)
    type __sync_val_compare_and_swap (type *ptr, type oldval,  type newval, ...)
    这两个函数提供原子的比较和交换,如果*ptr == oldval,就将newval写入*ptr,
    第一个函数在相等并写入的情况下返回true.
    第二个函数在返回操作之前的值。


    __sync_synchronize (...)

    理解上面这个东西,参照:http://blog.sunchangming.com/post/47188394133


    还有两个函数:
    type __sync_lock_test_and_set (type *ptr, type value, ...)
    将*ptr设为value并返回*ptr操作之前的值。

    void __sync_lock_release (type *ptr, ...)
    将*ptr置0

    转载于:https://www.cnblogs.com/kex1n/p/7111299.html

    展开全文
  • 在这个传输过程中能够拆分成线程的都已经被拆分成线程,在外部与协议栈的通讯中采用了无锁化编程,无锁队列,模拟实现了锁等操作,在性能优化后,性能下降三分之二,大家有遇到过类似的问题吗?如果有,都是如何...
  • 无锁化编程有哪些常见方法? 正确答案: D 你的答案: A (错误) 针对计数器,可以使用原子加 只有一个生产者和一个消费者,那么就可以做到免锁访问环形缓冲区(Ring Buffer) RCU(Read-Copy-Update),...
  • 1.注解+反射知道处理业务类型 2.生产者消费者模式(阻塞队列) 3.线程池+无锁化编程(业务处理)
  • 无锁化编程-基础篇

    千次阅读 2014-04-19 19:22:02
  • gcc从4.1.2提供了__sync_*系列的built-in函数,用于提供加减和逻辑运算的原子操作。 其声明如下: ...type __sync_fetch_and_add (type *ptr, type value, ...) ...type __sync_fetch_and_sub (type *ptr,...
  • gcc从4.1.2开始提供了__sync_*系列的build-in函数,用于提供加减和逻辑运算的原子操作,其声明如下: type __sync_fetch_and_add (type *ptr, type value, …):等同于将 ptr指向的内存加上 value值, 并且返回ptr...
  • 知道这些东西是理解和设计无锁化编程算法的基础。 下面的东西整理自网络。先感谢大家的分享!   __sync_fetch_and_add系列的命令,发现这个系列命令讲的最好的一篇文章,英文好的同学可以直接去看原文。...
  • linux无锁编程

    千次阅读 2015-08-20 19:03:56
    无锁化编程有哪些常见方法? 针对计数器,可以使用原子加只有一个生产者和一个消费者,那么就可以做到免锁访问环形缓冲区(Ring Buffer)RCU(Read-Copy-Update),新旧副本切换机制,对于旧副本可以采用延迟...
  • Linux无锁编程

    2015-08-21 19:24:00
    无锁化编程有哪些常见方法? 针对计数器,可以使用原子加只有一个生产者和一个消费者,那么就可以做到免锁访问环形缓冲区(Ring Buffer)RCU(Read-Copy-Update),新旧副本切换机制,对于旧副本可以采用延迟...
  • 无锁编程实战演练

    2019-04-21 20:27:00
    版权声明:本文为博主原创文章。欢迎转载。 https://blog.csdn.net/hzhsan/article/details/25837189 前段时间研究过一阵子无锁化编程。刚写了几个简单的...
  • 无锁编程技术及实现

    千次阅读 2014-11-13 14:21:15
    无锁编程技术及实现 作者:jx (360电商技术组)   1.基于锁的编程的缺点   多线程编程是多CPU系统在中应用最广泛的一种编程方式,在传统的多线程编程中,多线程之间一般用各种锁的机制来保证...
  • Java语言中的无锁化线程安全队列

    千次阅读 2018-12-28 11:30:38
    对于无锁化线程安全队列,实现要基于两个方面:原子性操作和内存访问控制。说的浅显一些,就是在JDK中,需要用到Unsafe类中的CAS操作,结合volatile关键字,来实现无锁化线程安全队列。具有代表性的就是...
  • java编程-无锁初始

    2019-10-08 17:20:11
    private final Node<K,V>[] initTable() { Node<K,V>[] tab; int sc; while ((tab = table) == null || tab.length == 0) { if ((sc = sizeCtl) < 0) ...

空空如也

空空如也

1 2 3 4 5 ... 8
收藏数 141
精华内容 56
关键字:

无锁化编程