Что такое процесс семафора? В контексте проблемы производителя/потребителя, является ли метод производителя/метод Consumer? Или это P(), если мы находимся в P(), а значение меньше 0?
P() {
value = value –1;
If value < 0
add the calling process to this semaphores list;
block this process
}
ПРИМЕР Если пользователь запускает сначала, прежде чем Producer произведет свой первый элемент
Потребитель уменьшит полное значение → full = -1, а затем, поскольку значение меньше 1, оно добавит вызывающий процесс в этот список семафоров. Но я не уверен, какой процесс. И что это значит блокировать этот процесс? Означает ли это, что весь метод для потребителя остановлен, и метод производителя работает?
код:
#define N 100
typedef int semaphore;
Semaphore fullBuffer = 0; // Initially, no item in buffer
Semaphore empty = N; // Initially, num empty buffer
Semaphore mutex = 1; // No thread updating the buffer
void producer(void) {
int item;
while(TRUE){
item = produce_item();
down(&empty);
down(&mutex);
insert_item(item);
up(&mutex);
up(&full);
}
}
void consumer(void) {
int item;
while(TRUE){
down(&full);
down(&mutex);
item = remove_item();
up(&mutex);
up(&empty);
consume_item(item);
}
}
Процесс, в этом использовании, как нить. Обычно, когда используется "многопроцессор" вместо "многопоточность", это означает, что ядро обрабатывает потоки, что позволяет компьютеру использовать несколько ядер. Однако это не важно для этой конкретной реализации, а также является ложным для этой конкретной реализации, потому что ничто не является атомарным.
Блокирование процесса здесь означает, что процесс, который вызывает P и decrememnts значение на что-либо отрицательное, остановит свое собственное выполнение, когда достигнет команды "блокировать этот процесс".
Предполагая многопоточность, ваша команда "продюсер" будет постоянно уменьшать пустой семафор, если она не попытается уменьшить ее ниже нуля, и в этом случае она будет остановлена, и будет выполняться только команда "потребитель". По крайней мере, только "потребитель" будет работать до тех пор, пока он не увеличит пустой семафор, достаточный для того, чтобы "производитель" теперь мог работать. Вы также можете переключать как "пустой" <-> "полный", так и "производитель" <-> "потребитель" в предыдущих двух предложениях, и они должны оставаться верными.
Кроме того, я предлагаю вам читать семафоры в другом месте, потому что они являются основной частью потоковой обработки/многопроцессорности, а другие люди описывают их лучше, чем когда-либо. (Посмотрите пример производителя/потребителя.)