【发布时间】:2011-02-04 12:46:27
【问题描述】:
我的应用程序中有这段代码。我怀疑它不是线程安全的,所以决定问问 SOers。
int * volatile int_ptr;
int count;
线程 1:
void grow(int new_count)
{
if(new_count <= count) return;
int * new_ptr = new int[new_count];
memset(new_ptr, 0 , new_count * sizeof(int));
memcpy(new_ptr,int_ptr,count);
int * dum_ptr = (int *)InterlockedExchange((volatile long *)&int_ptr,(long)new_ptr)
count = new_count;
delete [] dum_ptr;
}
线程 2:
int get_value(int index)
{
return int_ptr[index];
}
我知道可以使用 CRITICAL_SECTION,但线程 1 可能一周工作一次,而线程 2 一天工作数百万次。在 99.99999% 的访问 int_ptr 的尝试中,第二个线程将无缘无故地进入和退出临界区。这对我来说没有意义。该应用程序只能在 Windows 2000 和更高版本中运行,并且显然具有多核英特尔处理器。
这段代码是线程安全的吗?如果不是,我应该怎么做才能使它成为线程安全的?如何以原子方式读取 int_ptr ?一世。 e. :
int * dummy_ptr = read_atomic<int *>(int_ptr);
return dummy_ptr[index];
一个解决方案,包括std::vector,让我更快乐、更舒服。
【问题讨论】:
-
volatile在这里没有为你做任何事情 -
@John Dibling:严格来说是为了我的实现还是一般?
-
不是要拖钓,但如果您认为可以摆脱此代码,您的用户名是合适的。 :-)
-
两者,真的。
volatile在多线程编程中毫无用处。见:stackoverflow.com/questions/4557979/…
标签: c++ windows multithreading thread-safety atomic