默认情况下,不同的线程也有不同的堆栈。是否可以让它们共享同一个线程?例如:我想在线程 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
答案 0 :(得分:4)
堆栈只是内存的一部分,线程共享其整个地址空间。
线程有自己的堆栈,就像酒店客人有自己的房间一样,只是所有的门都没有上锁。每个客人通常都应该使用并留在自己的房间里,但没有什么能阻止他们走进另一个人的房间并弄乱另一个人的东西。如果被邀请,这是完全可以接受的。
您可以安全地从另一个线程访问一个线程堆栈上的对象,只要该访问是线程安全的,如果该对象不在堆栈上,并且您确保堆栈帧继续存在,直到不再访问该对象.