线程安全和静态函数
Thread Safety and static functions
假设我有一个:
class base
{
base(){f(this);};
static void f(base * b) {(b->d)++;};
int d;
};
现在,如果在2个独立的线程上,我创建了一个类型为base的对象,方法f
会被认为是线程安全的吗?我问这个问题,因为通常从我所知道的是,一个方法是线程安全的,它不应该使用静态成员和全局变量。但是,正如您从上面的示例中看到的,我决定不将变量d
设置为静态的,而是通过base的运行实例调用它。
另外,我认为我不需要用互斥锁保护这一行:(b->d)++;
,因为每个线程将有一个单独的base和变量d的实例。
我的分析正确吗?有什么需要我注意的吗?
是的,你的构造函数是线程安全的,因为它只访问实例变量(特别是d
)。它确实表现出未定义的行为,因为它从未初始化的d
中读取来执行增量,但这与线程安全无关。
base(): d(0) {f(this);};
现在d
已经在初始化器列表中初始化了,程序的行为就可以预测了。
相关文章:
- 将数组作为参数传递给函数安全吗?作为第三方职能部门,可以探索他们想要的之外的其他元素
- 给定一个C++嵌套的私有结构类型,是否有从文件范围静态函数访问它的策略
- 检查编译时是否存在静态函数
- 名称隐藏对静态函数继承的实例使用
- 如果 C 函数仍然可以间接执行(通过回调函数),那么将它声明为静态函数是否是一种不好的做法?
- 类中静态函数C++意外结果
- 在工人类中使用不同类的静态函数进行实验
- 类 Referention 中C++回调函数引用非静态函数
- 指向模板上下文中的成员函数或静态函数的指针
- 如何检测 Clang AST C++中的静态函数
- 内联asm编译器屏障(内存阻塞器)是算作外部函数,还是算作静态函数调用
- 如何在静态函数中使用成员函数数组
- (2 问题)"类"类型重新定义(即使 #pragma 一次),以及静态函数内的静态成员对象初始化?
- 生成代码(在编译时)以调用模板的每个实例化的静态函数
- C++无法访问或使用静态函数
- 本地静态函数对象线程安全的初始化
- StringHashTable 线程安全中使用的静态函数
- cpp 正文线程的本地函数是否安全?如果是这样,从中调用静态函数呢?
- C++静态函数和线程安全
- 线程安全和静态函数