gpt4 book ai didi

c++ - 在调用 main() 之前处理需要互斥锁的 C++ 初始化和多线程感知函数?

转载 作者:行者123 更新时间:2023-11-28 01:17:29 25 4
gpt4 key购买 nike

<分区>

所以我关心的是在 main() 被调用之前命中一个创建线程的函数。那时,线程安全函数需要有一个准备好的互斥体。只是,无法保证全局对象在 C++ 中的初始化顺序(好吧,在某种程度上,我们可以,但在大型项目中,祝你好运!)

所以我喜欢在运行时分配我的全局对象,例如单例。这样,它们会在您第一次调用它们的 instance() 函数时进行初始化,这意味着它们在需要时已准备就绪。但是,如果我有两个或更多线程在运行,它们可能最终都会创建一个实例,除非我确保在该函数中有一个有效的锁。

我想确保使用以下初始化:

pthread_mutex_t global_mutex = PTHREAD_MUTEX_INITIALIZER;

总是在编译时发生,因此 global_mutex 总是会为 pthread_mutex_lock() 做好准备。

这意味着我的单例(以及其他需要在调用 main() 之前初始化的类)可以依赖于该互斥体,如下面的简化代码所示:

// singleton.h
class singleton
{
public:
static singleton * instance();

...other functions...

private:
singleton();
};

// singleton.cpp
pthread_mutex_t global_mutex = PTHREAD_MUTEX_INITIALIZER;

singleton * global_singleton = nullptr;

singleton::singleton()
{
// do some initialization
}

singleton * singleton::instance()
{
pthread_mutex_lock(&global_mutex); // <- works even before main() called?
if(global_singleton == nullptr)
{
global_singleton = new singleton();
}
pthread_mutex_unlock(&global_mutex);
return global_singleton;
}

注意:我不是在询问单例模式的有效性。只是关于互斥锁。另外,不,您不能安全地在全局变量中使用智能指针,因为您无法知道在调用 instance() 函数之前它是否会被初始化。如果你想返回一个智能指针,你总是可以使用一个指向智能指针的裸指针。对于单例来说,这并没有太大改变。它仍然不会自动销毁。

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