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

时间:2021-05-19 19:07:07

标签: windows multithreading assembly x86 operating-system

默认情况下,不同的线程也有不同的堆栈。是否可以让它们共享同一个线程?例如:我想在线程 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

1 个答案:

答案 0 :(得分:4)

堆栈只是内存的一部分,线程共享其整个地址空间。

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

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

相关问题