使用堆分配的内存线程安全

Cam*_*Cam 12 c++ heap stack thread-safety

我正在读这个: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;
}
Run Code Online (Sandbox Code Playgroud)

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

编辑:啊.看起来我误读了文章的这一部分:

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

  • 它使用的唯一变量来自堆栈

(我接受了它的意思

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

  • 它使用的唯一变量来自堆栈

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

mdm*_*dma 13

如果您在支持多线程的环境中进行编码,那么您可以非常肯定new是线程安全的.

虽然内存在堆上,但指向它的指针位于堆栈上.只有你的线程有指向这个内存的指针,所以没有并发修改的风险 - 没有其他线程知道内存修改它的位置.

如果要将此指针传递给另一个线程,然后在原始(或另一个)线程的同时修改此内存,则只会遇到线程安全问题.