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++ 函数 strftime 和时间格式示例详解

    C++ 函数 strftime 和时间格式示例详解

    strftime 是 C/C++ 标准库中用于格式化日期和时间的函数,定义在 <ctime> 头文件中,它将 tm 结构体中的时间信息转换为指定格式的字符串,是处理时间输出的核心工具,这篇文章主要介绍了C++ 函数 strftime和时间格式,需要的朋友可以参考下
    2025-06-06
  • C++图文并茂分析讲解内存管理

    C++图文并茂分析讲解内存管理

    本章主要介绍C语言与C++的内存管理,以C++的内存分布作为引入,介绍C++不同于C语言的内存管理方式(new delete对比 malloc free),感兴趣的朋友来看看吧
    2022-09-09
  • 浅谈关于C语言中#define的副作用

    浅谈关于C语言中#define的副作用

    这篇文章主要介绍了关于C语言中#define的副作用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-03-03
  • C语言实现小猫钓鱼游戏

    C语言实现小猫钓鱼游戏

    这篇文章主要为大家详细介绍了C语言实现小猫钓鱼游戏,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-01-01
  • C语言 动态内存管理全面解析

    C语言 动态内存管理全面解析

    动态内存是相对静态内存而言的。所谓动态和静态就是指内存的分配方式。动态内存是指在堆上分配的内存,而静态内存是指在栈上分配的内存,本文带你深入探究C语言中动态内存的管理
    2022-02-02
  • C++中replace()函数使用方法汇总

    C++中replace()函数使用方法汇总

    这篇文章主要介绍了C++中replace()函数使用方法汇总,在这篇文章中为大家详细介绍C++ replace()函数的各种应用方式,希望朋友们可以从这里介绍的内容充分掌握这一应用技巧
    2015-11-11
  • C语言实现学生信息管理程序

    C语言实现学生信息管理程序

    这篇文章主要为大家详细介绍了C语言实现学生信息管理程序,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-03-03
  • 详解C/C++内存管理

    详解C/C++内存管理

    内存管理是C++最令人切齿痛恨的问题,也是C++最有争议的问题,C++高手从中获得了更好的性能,更大的自由,今天给大家分享C/C++内存管理的实例代码,需要的朋友参考下吧
    2021-06-06
  • C语言详细分析讲解关键字goto与void的作用

    C语言详细分析讲解关键字goto与void的作用

    我们在C语言中经常会见到void,也会偶尔见到goto,那么C语言中既然有goto,为什么我们在代码中见的很少呢?在以前很多的项目经验中,我们得到这样一条潜规则:一般项目都是禁用goto的,程序质量与goto的出现次数成反比。自后也就造成了我们一般不会使用goto
    2022-04-04
  • 基于C语言实现计算生辰八字五行的示例详解

    基于C语言实现计算生辰八字五行的示例详解

    生辰八字,简称八字,是指一个人出生时的干支历日期;年月日时共四柱干支,每柱两字,合共八个字。这篇文章主要介绍了C语言实现计算生辰八字五行的示例代码,需要的可以参考一下
    2023-03-03

最新评论