2010-05-16 26 views
11

我读这样的:http://en.wikipedia.org/wiki/Thread_safety线程安全与堆分配的内存

是下面的函数是线程安全的?

void foo(int y){ 
    int * x = new int[50]; 
    /*...do some stuff with the allocated memory...*/ 
    delete [] x; 
} 

在文章中说它是线程安全的,你只能使用堆栈中的变量。真?为什么?上述函数的后续调用不会在其他地方分配内存吗?

编辑:嗯。貌似我误读了文章的这一部分:

子程序是可重入的,因此线程安全的,如果

  • 它使用的唯一变量是从堆栈

(我认为它的意思是

子例程是可重入的,因此线程安全,如果个且仅当

  • 它使用的唯一变量是从堆栈

,其根据下面的答案,情况并非如此)

+9

使用'delete []'不是'delete'的数组# – 2010-05-17 00:01:41

+0

@Brian:Woops - 谢谢。在我已经输入了函数之后,我添加了数组部分,以便更清楚地说明我动态分配内存,但忘记添加[]。 +1 :) – Cam 2010-05-17 00:03:44

+1

看到维基百科的传播使用作为编程概念的参考,令人惊讶:) – ch0kee 2013-07-31 18:43:48

回答

10

如果您在支持多线程的环境中编码,那么你可以很确定new是线程安全的。

虽然存储器是在堆上,指针到它是在堆栈中。只有你的线程具有指向此内存,因此不存在并发修改的风险 - 没有其他线程知道哪里内存进行修改。

,如果你是这个指针传递给另一个线程然后将同时在同一时间为原来的(或其他)的线程修改该内存只能取得与线程安全问题。

+0

谢谢。你的答案和彼得之间的选择很艰难,但是最后你的有用提示是相关的,而他是关于矢量的:) – Cam 2010-05-17 00:21:12

0

新和删除可能会或可能不是线程安全的。他们可能是,但这是依赖于实现的。请参阅: C++ new operator thread safety in linux and gcc 4

为了线程安全,函数必须使用堆栈变量或将其对其他线程的访问同步到其他资源。只要新的独立的呼叫从不同的线程调用时在堆上分配不同的空间,你应该罚款。

2

这并不是说你只能使用堆栈变量,它说,使用堆变量“表明需要仔细检查,看它是否是不安全的”。

newdelete通常以线程安全方式实现(不确定标准是否可以保证),所以上面的代码可能没问题。

加上使用std::vector,而不是手动分配的阵列通常建议,但我认为你只提供作为一个例子:)

+1

我记得在一个他们不是的环境中工作。现在*那*很毛茸茸。 – Joshua 2010-05-17 00:48:51

+1

很幸运,你可以重写他们:) – 2010-05-17 12:55:32