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