0

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

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

我不知道如何处理这个。我在初始化代码中使用了关键部分,但这甚至不是问题。这个对象在被初始化之前就被使用了。

我尝试使用 __declspec(thread) 使这个线程成为本地线程,但这显然不适用于对象。

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

4

2 回答 2

2

如果您使用的是 Windows,则可以使用InitOnceExecuteOnce API。更多细节可以在Raymond Chen 的这篇文章中找到。另请查看更通用的std::call_once

于 2012-07-27T21:45:03.300 回答
1

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

不过,只需要留意资源匮乏。

于 2012-07-27T21:36:02.253 回答