竞争条件:一个线程创建静态对象,另一个线程在完成初始化之前使用它。如何处理?

时间:2012-07-27 21:32:10

标签: c++ multithreading static race-condition thread-local

我的代码中有几个地方创建了一次函数静态对象,然后在调用该函数时使用(复制)。可以从任何线程调用其中一个函数。该函数不访问除此静态对象之外的任何共享状态。

当线程1第一次调用该函数时,将创建并初始化该对象。然而,(幸运的是)我有一个可重复的情况,程序切换到线程2并在初始化完成之前调用相同的函数。该对象被分配并使用了坏数据!

我不知道如何处理这件事。我在初始化代码中使用关键部分,但这甚至不是问题。首先在初始化之前使用此对象。

我尝试使用__declspec(thread)将此线程设置为本地,但显然对于对象不起作用。

我可以用一个关键部分来包围整个事情,也许这是最好的解决方案,但我担心像代码的其他部分出现这样的问题 - 有一个通用的解决方案是很好的

2 个答案:

答案 0 :(得分:2)

如果您使用的是Windows,则可以使用InitOnceExecuteOnce API。更多细节可以在this Raymond Chen的帖子中找到。另请参阅更通用的std::call_once

答案 1 :(得分:1)

无法在对象上使用信号量,在创建对象时将信号量设置为1,然后在初始化对象(并准备使用)时将信号量递减为零。

虽然需要留意资源饥饿。