C++无锁数据结构实现示例详解

 更新时间:2023年12月27日 09:11:05   作者:kkkK2008  
这篇文章主要为大家介绍了C++无锁数据结构实现示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

无锁数据结构

无锁并非真正无锁,正如零拷贝并非零次拷贝。

实现

多生产者多消费者队列

// 基于自旋锁(或者CAS,原理相同,后者实现较为复杂)
// 通过atomic库中atomic_flag类进行实现自旋达到多生产者多消费者同步。
#include <iostream>
#include <atomic>
class Queue {
    atomic_flag spin_push_flag = false, spin_pop_flag = false;
public:
       void Push() {
        // 自旋+上锁
        while (spin_push_flag.test_and_set())
            ;
        // working...
        // 解锁
        spin_push_flag.clear();
    } 
    void Pop() {
        // 自旋+上锁
        while (spin_pop_flag.test_and_set())
            ;
        // working...
        // 解锁
        spin_pop_flag.clear();
    }
};

单生产者单消费者队列

// 类似内核kfifo
#include <iostream>
#include <mutex>
class Queue {
private:
    mutex mutex_push, mutex_pop;
public:
       void Push() {
        lock_gurad<mutex> lck(mutex_push);
        // working...
    } 
    void Pop() {
        lock_gurad<mutex> lck(mutex_pop);
        // working...
    }
};

测试

前提

每次主线程十次循环建立100个线程访问队列,即1k线程并发。取100次平均值。一共三个版本:互斥锁单线程访问a、单生产者单消费者b、多生产者多消费者c

场景结果
Push和Pop接口不工作a和b时间相仿;c是前二100倍
Push和Pop接口处理一些简单工作a和b时间相仿;c是前二的10倍
Push和Pop接口处理一些较耗时工作b最快;c其次,为b的2倍;a最慢,为b的7-8倍

总结

综合来看:单生产者单消费者模型效率最优(Linux内核kfifo)。不过具体使用何种模型实现线程安全,要根据实际场景进行选择,并且多测试,才能够达到最佳模型的选择。此处仍有一点未提及:若要实现多线程并发访问数据结构,即单生产者单消费者或者多生产者多消费者,仍需要尽量避免共同数据的访问防止segment fault。

以上就是C++无锁数据结构的详细内容,更多关于C++无锁数据结构的资料请关注脚本之家其它相关文章!

相关文章

  • C语言简易通讯录的实现代码

    C语言简易通讯录的实现代码

    这篇文章主要为大家详细介绍了C语言简易通讯录的实现代码,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-11-11
  • c++ 预处理的图灵完备之引言

    c++ 预处理的图灵完备之引言

    这篇文章主要介绍了c++ 预处理的图灵完备之引言,需要的朋友可以参考下
    2017-07-07
  • C++中this指针理解及作用

    C++中this指针理解及作用

    这篇文章主要介绍了C++中this指针理解及作用,文章通过举例展开相关详细内容,具有一定的参考价值,需要的小伙伴可以参考一下
    2022-05-05
  • C语言超详细讲解循环与分支语句基础

    C语言超详细讲解循环与分支语句基础

    各位小伙伴们,今天给大家带来的是循环与分支语句,本篇将会向大家介绍这些语句的格式和使用的基本方法,感兴趣的朋友来看看吧
    2022-04-04
  • c语言socket多线程编程限制客户端连接数

    c语言socket多线程编程限制客户端连接数

    这篇文章主要介绍了c语言socket多线程编程,可以限制客户端连接数,大家参考使用吧
    2013-12-12
  • c++验证哥德巴赫猜想

    c++验证哥德巴赫猜想

    这篇文章主要介绍了c++验证哥德巴赫猜想,哥德巴赫猜想就是任一大于2的偶数,都可表示成两个素数之和,需要的朋友可以参考下
    2014-04-04
  • 详解C语言之堆栈

    详解C语言之堆栈

    这篇文章主要为大家介绍了C语言的堆栈,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助
    2021-11-11
  • C++面向对象之多态的实现和应用详解

    C++面向对象之多态的实现和应用详解

    相信大家都知道面向对象的三大特性是封装,继承和多态,下面这篇文章主要给大家介绍了关于C++面向对象之多态的实现和应用的相关资料,文中通过示例代码介绍的非常详细,需要的朋友可以参考借鉴,下面来一起看看吧。
    2017-09-09
  • C语言和C++的6点区别

    C语言和C++的6点区别

    在本篇文章里我们给大家整理了关于C语言和C++的6点区别,需要的朋友们可以学习参考下。
    2019-02-02
  • C语言实现简单的扫雷功能

    C语言实现简单的扫雷功能

    这篇文章主要为大家详细介绍了C语言实现简单的扫雷功能,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-11-11

最新评论