谁唤醒了一个被阻止的进程因为它在信号量上执行等待失败了?

时间:2012-02-23 09:12:02

标签: synchronization operating-system scheduling semaphore

如果进程对信号量执行等待并且不成功(因为信号量的值最初为0),我理解该进程被阻塞(进入睡眠模式?)。当信号量值大于0时,谁唤醒了这个过程? 这个操作系统是否具体?如果是,那么POSIX信号量如何表现?

2 个答案:

答案 0 :(得分:0)

我认为这是特定于操作系统的,但没有看到很多方法。

例如,在Linux上,在信号量上执行up会唤醒等待任务(查找等待队列)并将其标记为可运行。然后,调度程序决定运行哪个任务。

答案 1 :(得分:0)

释放信号量时,将从块中删除相关线程,但不一定运行调度程序。因此,行为是不确定的。

查看信号量代码应该提供答案。

运行简单的多线程测试可以提供实用的答案。一个线程具有一个循环,该循环采用sempanore,将变量设置为1,然后释放该变量,并将变量设置为零。循环中的另一个线程获取该信号量并打印该变量,两次并释放该信号量。

如果调度是在释放信号量时运行的,则另一个线程将立即运行,否则,原始线程将一直运行直到阻塞信号量为止。

在我的机器上,“ 1”和“ 0”的模式不稳定。 在信号量释放后添加usleep()将鼓励调度程序运行。 添加睡眠使其相当稳定。

#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>

pthread_mutex_t count_mutex     = PTHREAD_MUTEX_INITIALIZER;

void *functionCount1();
void *functionCount2();

int  x = 0;

void main()
{
   pthread_t thread1, thread2;

   pthread_create( &thread1, NULL, &functionCount1, NULL);
   pthread_create( &thread2, NULL, &functionCount2, NULL);
   pthread_join( thread1, NULL);
   pthread_join( thread2, NULL);

   exit(0);
}

void *functionCount1()
{
    for(;;)
    {
        pthread_mutex_lock( &count_mutex );
        x = 0;
        pthread_mutex_unlock( &count_mutex );
        // usleep(10);
        x = 1;
    }
}

void *functionCount2()
{
    for(;;)
    {
        pthread_mutex_lock( &count_mutex );
        printf("%d", x);
        // usleep(10);
        printf("%d", x);
        pthread_mutex_unlock( &count_mutex );
    }
}