gpt4 book ai didi

C++构造函数线程安全

转载 作者:行者123 更新时间:2023-11-30 00:47:10 27 4
gpt4 key购买 nike

假设我在构造函数中初始化了一个成员变量 vector,并且这个 vector 在其他几个成员函数中被读取(而不是写入到其他任何地方)。我是否需要保护对 vector 的访问(包括在构造函数中),或者是否保证对象在被其他线程使用之前将被完全初始化并刷新到主内存?

举个例子:

class A
{
public:
A();
void f1();
void f2();
private:
std::vector<int> v;
};

A::A()
{
// do some setup work in v
v.push_back(1);
}

// called from thread1
void A::f1()
{
// some readonly work on v
for (auto i : v) {
// do something on i
}
}

// called from thread2
void A::f2()
{
// more readonly work on v
if (v.empty()) {
// do other work
}
}

我是否需要在 A::A()A::f1()A::f2()< 中锁定保护 v/?

最佳答案

对象是由单个线程创建的,因此在涉及成员变量的构造函数中运行代码时,您永远不必担心线程安全问题。但是,如果您在构造函数中使用静态变量,则可能需要在访问周围添加某种形式的锁定。

有一种极端情况,构造函数中的代码可以被多个线程调用,这就是您使用 placement new 时的情况。例如,假设您在某处有一个缓冲区,您将向其中分配一个对象:

byte buffer[100];
Foo *foo = new (buffer) Foo;

在这里,除非您锁定对 new 的调用,否则两个或多个构造函数可以并行运行,因为它们针对同一内存块运行。然而,这是一个真正的特殊边缘情况,需要特殊处理(例如,锁定放置新结构)。

关于C++构造函数线程安全,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35598311/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com