gpt4 book ai didi

c++ - 如何初始化大线程本地对象?

转载 作者:行者123 更新时间:2023-12-02 10:31:06 26 4
gpt4 key购买 nike

在大型C++程序中,很多线程来来往往。使用线程池可以稍微缓解此问题,但出于该问题的目的,假定线程总数是一个很大的值,但是,只有极少数线程用于调用struct TL中的函数。问题是struct TL包含一些很大类型thread_local变量(即,它们的实例占用大量内存)。因此,我们要确保只有使用struct TL的线程才能构造这些对象。有没有针对这种情况的设计模式? (我们无法控制何时创建或销毁线程)。

以下代码显示了一个简单的解决方案:

struct TL {
void func() {
if(!flag.used) {
flag.used = true;
large_1 = new Large_1();
large_2 = new Large_2(); }
// use large_1 and large_2
}
private:
struct init {
~init() {
delete large_1;
delete large_2; }
bool used = false; };

static thread_local init flag{};
static thread_local Large_1* large_1 = nullptr;
static thread_local Large_2* large_2 = nullptr;
};

每次我们与 struct TL交互时,它都使用一个标志来检查字段是否已初始化 。另外,当线程存在时,flag的析构函数会删除large_1large_2。这种方法的问题是,每次与struct TL交互时,我都要检查标志。我正在寻找类似设计模式的东西来解决这个问题,它不需要我每次使用struct TL时都检查标志。

最佳答案

我通常使用这样的东西:

struct control_block {
big_object& get_big_object() {
if (_big_object == nullptr)
_big_object = std::make_unique<big_object>();
return *_big_object;
}
private:
std::unique_ptr<big_object> _big_object;
};

static thread_local control_block thread_local_control_block;

auto& big_obj = thread_local_control_block.get_big_object();

无法避免检查是否按需创建对象。但是,您可以指定使用该对象的线程必须显式调用某种初始化方法-然后可以将 if替换为简单的 assert

关于c++ - 如何初始化大线程本地对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62281164/

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