кто пробуждает процесс, который заблокирован, потому что он выполнил ожидание на семафоре безуспешно? - PullRequest
1 голос
/ 23 февраля 2012

Если процесс выполняет ожидание на семафоре и является безуспешным (поскольку значение семафора было изначально 0), я понимаю, что процесс заблокирован (переходит в спящий режим?).Кто пробуждает процесс, когда значение семафора больше 0?Эта операционная система специфична?Если да, то как ведут себя семафоры POSIX?

Ответы [ 2 ]

0 голосов
/ 05 октября 2018

Когда освобождается семафор, связанные потоки удаляются из блока, но планировщик не обязательно запускается.Таким образом, поведение не определено.

Просмотр кода семафора должен дать ответ.

Выполнение простого многопоточного теста может дать практический ответ.Один поток имеет цикл, который принимает sempanore и устанавливает переменную в 1, а затем освобождает переменную и устанавливает переменную в ноль.Другой поток в цикле берет семафор и печатает переменную, дважды и освобождает семафор.

Если расписание запускается после освобождения семафора, другой поток будет запущен немедленно, если не исходный потокработать до тех пор, пока он не заблокируется на семафоре.

На моей машине структура единиц и нулей была ошибочной.Добавление 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 );
    }
}
0 голосов
/ 23 февраля 2012

Я думаю, что это зависит от ОС, но я не вижу много способов сделать это.

Например, в Linux выполнение up на семафоре пробуждает ожидающие задачи (ищите очереди ожидания)и отмечает их работоспособными.Затем планировщик решает, какую задачу запустить, если таковая имеется.

...