谁唤醒了一个进程,该进程因对信号量执行等待而被阻止,但没有成功



如果一个进程对信号量执行了等待,但没有成功(因为信号量的值最初是0),我知道该进程被阻止了(进入睡眠模式?)。当信号量值大于0时,谁唤醒进程?这个操作系统是特定的吗?如果是,那么POSIX信号量的行为如何?

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

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

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

查看信号量代码应该会给出答案。

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

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

在我的机器上,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 );
    }
}

最新更新