2016-11-16 5 views
1

Рассмотрим фрагмент кода ниже:Каковы значения параметров, переданных sem_init() в Семафоры (операционные системы)?

#include <pthread.h> 
    #include <semaphore.h> 

    sem_t empty; 
    sem_t full; 
    sem_t mutex; 

    int main(int argc, char *argv[]) 
    { 
    int MAX = 10;//Size of the Buffer 
    sem_init(&empty, 0, MAX); 
    sem_init(&full, 0, 0); 
    sem_init(&mutex, 0, 1); 

    return 0; 
    } 

только требуемый код, я уже упоминал выше. Это часть кода производителя и потребителя. Каковы значения каждого параметра в sem_init()? Я мог понять, что 1-й параметр - это адрес переменной семафора, а третий - это значение.

Почему второй параметр всегда равен 0? Что это значит?

Указываем критическое значение для ожидания семафора с использованием второго параметра?

wait(S) { 
    while (S <= 0) 
    ; // busy wait 
    S--; 
    } 

Если я прохожу 3 в качестве 2-го параметра для sem_init(), делает петлю в то время как ожидания (S) будет изменен на

while (S <= 3) 

как это?

+1

Пожалуйста, прочитайте страницу руководства. Лучше, чтобы объяснение здесь и будет полным –

ответ

1

Всегда старайтесь читать документацию Linux (man <command or system_call>) для этих сомнений.

для случая man sem_init
sem_init() инициализирует неназванный семафор по адресу указал на СЭМ. Аргумент value указывает начальное значение семафора .

веб link МАН страниц

+0

Я никогда не думал, что это может быть заявление в командной строке. Я пытался решить его с точки зрения t c-языка. – NaveeNeo

+0

его, вероятно, системный вызов. OS предоставляет утилиту системного вызова на языке C, потому что само ядро ​​Linux написано на языке C. –

1

Пожалуйста, взгляните на http://man7.org/linux/man-pages/man3/sem_init.3.html. Что касается второго аргумента:

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

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