一般理论问题。
我正在尝试从源代码构建一个库(如果有人在意的话,是FFTW,但这并不重要),我注意到有一个选项可以禁止使用alloca
。
我知道使用alloca
的危险,但是我正在评估使用和不使用alloca
时FFTW的性能。
alloca
在线程安全方面是否存在已知问题?当我将一定数量的线程与FFTW一起使用时(在后台调用alloca
时,我发现性能受到了极大的打击)。如果这很重要,我会坚持使用等于2的幂的线程。
FFTW是否有可能通过alloca
共享线程本地堆栈上的对象?我只是想弄清楚为什么在一定数量的线程中为什么会出现这种极端的性能下降。但是,我不完全了解alloca
真正在做w /线程背后的理论。
答案 0 :(得分:0)
简短答案:It doesn't。 alloca()
保证是MT安全的。
更长的答案:alloca()
不是复杂的函数。按照规范,它返回指向可以自动释放的位置的指针。请注意,这不再是一种好习惯:
alloca()函数返回一个指向分配空间开头的指针。如果分配导致堆栈溢出,则程序行为未定义。
如您所见,分配会导致堆栈溢出,因此通过增大SP来在堆栈上分配空间。线程共享堆,但不共享栈,因此使用alloca()
进行多线程操作绝对不会遇到麻烦。
更安全的方法是使用VLA而不是alloca()
,因为两者的作用相同,而且(如我所怀疑的那样),VLA 更快更轻。