我一直在寻找懒惰初始化(让我们说全局变量,但它可能是任何东西)。到目前为止,我想出了是一样的东西等待免费或无锁初始化
enum state {
uninitialized,
initializing,
initialized
};
state s;
char memory[sizeof(T)];
T& initialize() {
auto val = compare_and_swap(&s, state::uninitialized, state::initializing);
if (val == initialized)
return *(T*)memory;
if (val == initializing) {
while(atomic_read(&s) != state::initialized);
return *(T*)memory;
}
new (memory) T();
atomic_write(&s, state::initialized);
return *(T*)memory;
}
在它已经被初始化的情况下,那么它的无等待。但是我遇到了一个线程正在初始化的情况。完成初始化或等待初始化完成所需的步骤数量与线程数量不成比例。但是,如果初始化线程暂停,其他线程必须任意等待,直到它恢复。所以在一般情况下,它不是无锁或无等待的。
是否可以创建无等待或无锁的惰性初始化?
此代码甚至不无锁...... –
这显然不是无锁。这是问题的根源。如果我有无锁的惰性初始化,为什么我会问一个问题,询问它是否可能? – Puppy
够公平的;我被复杂的代码抛弃了 - 如果你只是想要一个锁定的懒惰初始化,你可以使用一个'static'变量并完成它。 –