Редактирование: РОС, ответы на задачи

Материал из eSyr's wiki.

Перейти к: навигация, поиск

Внимание: Вы не представились системе. Ваш IP-адрес будет записан в историю изменений этой страницы.

ПРЕДУПРЕЖДЕНИЕ: Длина этой страницы составляет 96 килобайт. Страницы, размер которых приближается к 32 КБ или превышает это значение, могут неверно отображаться в некоторых браузерах. Пожалуйста, рассмотрите вариант разбиения страницы на меньшие части.

Правка может быть отменена. Пожалуйста, просмотрите сравнение версий, чтобы убедиться, что это именно те изменения, которые вас интересуют, и нажмите «Записать страницу», чтобы изменения вступили в силу.

Текущая версия Ваш текст
Строка 50: Строка 50:
'''Ответ (не реализовано "блокирование" в случае если процесс ждет входа, заменено циклом)'''
'''Ответ (не реализовано "блокирование" в случае если процесс ждет входа, заменено циклом)'''
<pre>
<pre>
-
int count = N;
+
struct CountingSemaphore {
-
boolSemaphore sem = 1;
+
int val;
-
 
+
BinarySemaphore wait; // ждём здесь, чтобы ждать для S
-
P(s) {
+
BinarySemaphore mutex; // защищает val
-
bool success = false;
+
-
while(!success) {
+
CountingSemaphore(int k) {
-
P(sem);
+
val = k;
-
if(count > 0) {count--; success = true;}
+
wait = 0;
-
V(sem);
+
mutex = 1;
-
}
+
}
 +
void P();
 +
void V();
 +
} S;
 +
 +
void CountingSemaphore::P() {
 +
S.mutex.P();
 +
if (S.val <= 0) {
 +
S.val--;
 +
S.mutex.V();
 +
S.wait.P();
 +
}
 +
else {
 +
S.val--;
 +
S.mutex.V();
 +
}
}
}
-
 
+
-
V(s) {
+
void CountingSemaphore::V() {
-
P(sem);
+
S.mutex.P();
-
count++;
+
if (S.val < 0)
-
V(sem);
+
S.wait.V();
 +
S.val++;
 +
S.mutex.V();
}
}
</pre>
</pre>
Строка 90: Строка 107:
}
}
</pre>
</pre>
 +
=== Задача 3 (события через двоичный семафор) ===
=== Задача 3 (события через двоичный семафор) ===

Пожалуйста, обратите внимание, что все ваши добавления могут быть отредактированы или удалены другими участниками. Если вы не хотите, чтобы кто-либо изменял ваши тексты, не помещайте их сюда.
Вы также подтверждаете, что являетесь автором вносимых дополнений, или скопировали их из источника, допускающего свободное распространение и изменение своего содержимого (см. eSyr's_wiki:Авторское право).
НЕ РАЗМЕЩАЙТЕ БЕЗ РАЗРЕШЕНИЯ ОХРАНЯЕМЫЕ АВТОРСКИМ ПРАВОМ МАТЕРИАЛЫ!

Шаблоны, использованные на этой странице:

Личные инструменты
Разделы