【问题标题】:Can different threads share a stack (win32)?不同的线程可以共享一个堆栈(win32)吗?
【发布时间】: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


【解决方案1】:

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

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

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

【讨论】:

    猜你喜欢
    • 2018-07-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-04
    • 2012-09-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多