【发布时间】:2021-08-09 01:29:58
【问题描述】:
默认情况下,不同的线程也有不同的栈。是否可以让它们共享同一个线程?例如:我想调用线程 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
【问题讨论】:
-
否,但您可以将指针传递给另一个线程的堆栈上的值,因为堆栈位于内存中并且线程共享内存。
-
@Jester 我如何找出堆栈上的值位于哪个地址?在thread2中,指向值地址的指针是esp,但我不能直接访问thread1中thread2的esp,可以吗?所以我需要将 esp 保存在一个全局变量中,但这似乎是一个非常费力的解决方法。还有其他方法吗?
-
听起来你真正的问题是为一个线程找出一些工作线程同步机制,以便能够让另一个线程知道它应该做某事。您在一个线程的堆栈中拥有内存中的数据这一事实并不难 - 您可以
lea一个指向寄存器的指针,并将该指针存储到一个共享变量中,这是线程间通信机制的一部分,用于线程找工作做。或者你当然可以使用你想要传递给它的任何参数来启动一个新线程。 -
您可以通过生产者-消费者队列传递消息中的地址/实例/任何内容。您可以将它传递给构造函数参数。您可以将它作为“CreateThread()”指针参数的一部分传递。选择你的毒药:)
标签: windows multithreading assembly x86 operating-system