不同的线程可以共享一个堆栈(win32)吗?

Can different threads share a stack (win32)?

默认情况下,不同的线程也有不同的堆栈。是否可以让他们共享同一个线程?例如:我想在线程 A 中调用一个函数,但该函数调用的参数在线程 B 中被压入堆栈。由于这些线程不共享堆栈,因此线程 A 中的函数调用将失败。

示例代码:

section .bss
lock resb 1

section .text
..start:
...                ;push CreateThread parameters for thread2
call [CreateThread]
loop:
cmp lock, 1
jnz loop
call [exampleFunc]
ret

thread2:
push exampleFuncParam
mov al, 1
mov [lock], al
ret

堆栈只是内存的一部分,线程共享它们的整个地址space。

线程有自己的堆栈,就像酒店客人有自己的房间一样,只是所有的门都没有锁。每个客人通常都应该使用和留在自己的房间里,但没有什么能阻止他们走进别人的房间并弄乱别人的东西。如果邀请进来,这是完全可以接受的。

您可以从另一个线程安全地访问一个线程的堆栈上的对象,只要该对象不在堆栈上时访问是线程安全的,并且您确保堆栈帧继续存在直到对象不存在访问时间更长。