gpt4 book ai didi

c++ - 有没有办法设计这个 "static class"使其线程安全?

转载 作者:太空狗 更新时间:2023-10-29 21:24:25 24 4
gpt4 key购买 nike

我有一个所有方法都是静态的类,如下所示:

class A { 
public:
static std::string getA() { GlobalData::alfa; }
static std::string sum(int x, int y) { ... }

static int convert() { ... }

};

我需要 A 是线程安全的。 Whitch 是更好的设计吗?我需要像这样将所有方法转换为非静态方法吗?

class B { 
public:
std::string getA() { g.alfa; }
std::string sum(int x, int y) { ... }
int convert() { ... }

private:
GlobalData g;
};

考虑 GlobalData 是一个像这样的简单 POD:

struct GlobalData
{
static std::string foo;
static int bar;
...
}

最佳答案

您可以保留 A 类的原始布局,甚至可以将其更改为命名空间,但您必须将 GlobalData 结构定义为线程本地存储,如果它包含的数据必须特定于每个线程:

 struct GlobalData {
static thread_local std::string alfa;
// other members here
};

您可能需要调用一个函数来根据每个线程的需要初始化数据。

请注意,如果所有成员都已定义static,您还可以将该结构转换为命名空间:

namespace GlobalData {
thread_local std::string alfa;
// etc.
}

namespace A {
std::string getA() { return GlobalData::alfa; }
std::string sum(int x, int y) { /* ... */ }

int convert() { /* ... */ }
}

这提高了代码的可读性。

同样的规则应该适用于您原始代码中的任何全局范围的数据,这些数据必须成为特定于线程的。

关于c++ - 有没有办法设计这个 "static class"使其线程安全?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16238384/

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