【问题标题】:what is the stack of threads for each semaphore每个信号量的线程堆栈是多少
【发布时间】:2019-06-08 02:07:57
【问题描述】:
我知道每个线程都有自己的堆栈。
我的教科书说:
假设一个特定的信号量实现对每个信号量使用一个 LIFO 线程堆栈。当线程在 P 操作中阻塞信号量时,它的 ID 被压入堆栈。同样,V 操作从堆栈中弹出顶部线程 ID 并重新启动该线程
我不明白的是。由于每个线程都使用自己的堆栈来存储其线程ID,并且显然线程不与其他线程共享堆栈,那么LIFO线程堆栈是什么意思?因为一个线程只把它的线程放到堆栈上,不会包含另一个线程的 id,为什么在这里使用 LIFO 术语,不是只有当我们可以将多个项目推入堆栈时 LIFO 才有意义吗?
【问题讨论】:
标签:
linux
multithreading
stack
semaphore
【解决方案1】:
您的操作系统需要知道哪些线程正在等待每个信号量。为了维护该列表,操作系统可以为每个信号量对象使用LIFO 数据结构,即stack。
不要将它与每个线程的stack 混淆。
【解决方案2】:
我不明白的是。由于每个线程都使用自己的栈来存储自己的线程ID,而且显然线程不与其他线程共享栈,那么线程的LIFO栈是什么意思呢?
如果他们愿意,线程可以与其他人共享他们的堆栈。每个线程都有自己的堆栈,不会妨碍一个线程访问另一个线程的堆栈。
因为一个线程只将它的线程放入堆栈中,不会包含另一个线程的 id,为什么在这里使用 LIFO 术语,不是只有当我们可以将多个项目推入堆栈时 LIFO 才有意义吗?
每个线程都有自己的堆栈这一事实并不妨碍其他线程出于其他目的而存在。每个线程都有自己的堆栈对信号量可以对堆栈做什么或不做什么没有影响。
想想苹果。你可以拥有它们。你可以分享它们。你可以吃它们。
现在,假设有十个孩子,每个孩子都有自己的苹果。这是否意味着不存在共享的第十一个苹果?这会阻止他们用其他苹果做其他事情吗?不,它没有。
所以,是的,每个线程都有自己的堆栈。如果他们愿意,他们还可以共享这些堆栈。
而且,一个信号量也可以有一个栈。它可以用那个堆栈做任何它想做的事情。这与线程可能拥有的任何其他堆栈无关。