关于LwRB环形缓冲区开源库的纯C++版本支持原子操作

发布时间:2024年01月09日

1、LwRB环形缓冲区开源库:

GitHub - MaJerle/lwrb: Lightweight generic ring buffer manager libraryLightweight generic ring buffer manager library. Contribute to MaJerle/lwrb development by creating an account on GitHub.icon-default.png?t=N7T8https://github.com/MaJerle/lwrb

2、相关的使用方法参考其它文章

3、在C++中使用原子操作时编译失败,对其进行分析并做相应的修改。

1)现象:gcc编码成C库成功,用C连接成功,程序成功,但想在C++里使用,用g++编译会失败。

2)分析:原因是原子操作在C11和C++11上函数不一致造成的,而lwrb库的作者作了C++的兼容却没有隐藏C原子操作不一致的特性函数。

3)问题:那如果要在C++中使用怎么处理呢?

4)修改成纯C++函数:

? ? ? a、头文件:

去掉以下内容:

__cplusplus宏判断、extern、LWRB_DISABLE_ATOMIC等C特性的东西

加上:

#include <atomic>
//#include <stdatomic.h>

using namespace std;

? ? b: 源文件,修改成cpp或cxx

去掉以下内容:

LWRB_DISABLE_ATOMIC相关的部分代码

修改宏成为以下内容:
#define BUF_SEND_EVT(b, type, bp)                                                                                      \
    do {                                                                                                               \
        if ((b)->evt_fn != NULL) {                                                                                     \
            (b)->evt_fn((lwrb_t*)(b), (type), (bp));   //void*总是报错,直接换成 lwrb_t*                                                             \
        }                                                                                                              \
    } while (0)


#define LWRB_INIT(var, val)        ((var)=(val))
#define LWRB_LOAD(var, type)       ((var).load(type))
#define LWRB_STORE(var, val, type) ((var).store((val), (type)))


对于类型转换总是提示错误,可以:

加上编译选项 -fpermissive 

或 用static_cast 

或 直接强制类型转换

5)测试修改效果:

a:编译测试,成功通过。

b:如果只是g++,只修改a头文件就可以成功

c:如果是海思等嵌入式g++,如aarch64-himix200-linux-g++则必须修改a头文件和b源文件。

6)如果想兼容C:

a:在代码中隐藏一下C的原子操作函数

b:用C++宏判断__cplusplus、extern处理C++部分

文章来源:https://blog.csdn.net/howesao/article/details/135484925
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。