我在我的应用程序中有这段代码。我怀疑它不是线程安全的,所以决定询问SOers。在Windows操作系统中的线程安全和原子读取
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以及更高版本的Intel处理器上运行,显然是多核心处理器。
此代码是否线程安全?如果没有,我应该怎么做才能保证线程安全?我如何可以自动读取int_ptr?一世。即:
int * dummy_ptr = read_atomic<int *>(int_ptr);
return dummy_ptr[index];
一个解决方案,包括std::vector
,让我更快乐,更舒适。
`volatile`在这里对你没有任何帮助 – 2011-02-04 13:31:03
@John Dibling:严格来说我的实施还是一般? – 2011-02-04 13:32:48