每个信号量的线程堆栈是多少

时间:2019-01-14 03:45:32

标签: linux multithreading stack semaphore

我知道每个线程都有自己的堆栈。

我的课本上说:

假设特定的信号量实现对每个信号量使用LIFO线程堆栈。当线程在P操作中阻塞信号量时,其ID将被压入堆栈。同样,V操作会从堆栈中弹出顶部线程ID,然后重新启动该线程

我不明白的是。由于每个线程使用其自己的堆栈来存储其线程ID,并且显然线程不与其他线程共享堆栈,那么LIFO线程堆栈是什么意思?因为一个线程只将其线程放到不包含另一个线程的ID的堆栈中,所以为什么在这里使用LIFO术语?如果我们可以将多个项目压入堆栈,那么LIFO是否不是有意义的?

2 个答案:

答案 0 :(得分:1)

您的操作系统需要知道哪些线程正在等待每个信号量。为了维护该列表,操作系统可以对每个信号量对象使用LIFO数据结构,即stack

请勿将其与每个线程的stack混淆。

答案 1 :(得分:0)

  

我不明白的是。由于每个线程都使用自己的堆栈来存储其线程ID,并且显然线程不与其他线程共享堆栈,所以LIFO线程堆栈是什么意思?

如果需要,线程可以与其他人共享其堆栈。每个线程都有自己的堆栈,这并不妨碍一个线程访问另一线程的堆栈。

  

因为一个线程只将其线程放到不包含另一个线程的id的堆栈中,为什么在这里使用LIFO术语,不是LIFO仅在我们可以将多个项目压入堆栈时才有意义?

每个线程都有自己的堆栈这一事实并不能阻止其他线程出于其他目的而存在。每个线程都有自己的堆栈,这对sempahore使用堆栈可以做什么或不可以做什么没有影响。

想想苹果。您可以拥有它们。您可以分享。你可以吃它们。

现在,说有十个孩子,每个孩子都有自己的苹果。这是否意味着不能存在共享的第11个苹果?这是否会阻止他们与其他苹果做其他事情?不,不是。

所以,是的,每个线程都有自己的堆栈。他们还可以根据需要共享这些堆栈。

但是,信号量也可以有一个堆栈。它可以使用该堆栈执行任何所需的操作。这与线程可能具有的任何其他堆栈无关。