c++ - c++中静态数据成员的实现
问题描述
我正在研究定义为成员函数并使用对象的公共变量的多线程函数。
我正在考虑两种方法:
1. 全局变量
static int var = 0;
class Object {
void specialOp { var++; }
}
2.静态数据成员
class Object {
static int var = 0;
void specialOp { var++; }
}
我更喜欢第二种选择,但是当我查看互联网时,我没有找到静态数据成员的实现来知道我是否需要处理锁,或者复杂性是否高于在全局变量中使用。
解决方案
C++ 中的static
关键字根据使用位置的不同有不同的含义。
- 在全局范围内,它定义了一个没有链接的全局变量(使该变量在源和包含的头文件的当前编译单元之外无法访问)
- 作为类成员,它声明了一个全局变量,可以在任何文件中使用
Class::variable
但根据类的访问说明符进行访问(也需要在 cpp 文件中声明它) - 在函数中,声明一个只能在函数内部访问的全局变量。保证对同一函数的不同调用访问相同的内存。
但是,没有一个能够解决多线程问题。要解决多线程问题,您有几个选择:
- 声明变量
thread_local
。这意味着每个线程都有自己的变量版本。 - 通过使用
std::atomic
或其他一些线程同步原语(如std::mutex
推荐阅读
- ajax - 使用 Order By 对产品进行排序
- ios - 核心数据:如何最好地重复检查唯一性?保存上下文?取数?
- excel - VBA CDate(Now()) 导致类型不匹配
- node.js - 安装 Strapi 时 SQLite3 出现问题 - 无法在类似字节的对象上使用字符串模式
- angular - Angular ngx-quill 编辑器 - 处理图像点击
- python - jupyter notebook中movies.dat文件解析
- c# - 使用 MVVM 在 Xamarin.Forms 中单击时如何更改 Frame 控件的颜色
- regex - 如何使用 sed 查找路径并将输出与字符串连接起来
- r - 在对 lavaan 进行验证性因子分析时与因子排序相关的错误
- angular - 如何在表单数组中聚焦无效项目