я понимаю, что уже очень поздно, поэтому не рассчитываю, что кто-то
собирётся ответить на этот вопрос в течении часа, но тем не менее это
пример, на котором можно потренироваться. Пишите ответы - итоговые
дополнительные баллы, будут начисляться и за активность.
Вопрос [10 баллов]:
Дан пример кода критической секции для двух функций, синхронизрующихся
на общем ресурсе:
void func1()
{
....
lock (mutex1)
lock (mutex2)
...
unlock (mutex1)
unlock (mutex2)
...
}
void func2()
{
....
lock (mutex2)
lock (mutex1)
...
unlock (mutex2)
unlock (mutex1)
...
}
Исправьте ошибки в синхронизации, которые могут приводить к
"потенциальным тупикам", поясните в чём они состоят.
--
Sin (Sinelnikov Evgeny)
Кнопка Ответить или Ответить Всем должны указывать адрес
автоматически, если его там не будет, то не сложно добавить, хотя и
неудобно, но это уже проблема вашего почтового клиента. Вообще я таких
проблем не встречал.
В общем, подытоживая... Засчитываются те ответы, которые пришли в
ответ на моё сообщение в рассылку. Проверить это можно на сайте
группы:
http://groups.google.com/group/saratov-real-time-systems/topics
Там же можно написать ответ, если у вас почтой не ладится. Хотя с
почтой удобнее - пришло письмо, нажал ответить и всё.
Вот моё письмо в теме "[RTest] Пробный вопрос" сейчас появится, а вот
ваше письмо Алексей пришло только мне лично, поскольку в адресе
отправки указан только я, а группы там нет. Вообще меня указывать не
нужно, достаточно только адреса группы.
5 декабря 2010 г. 10:57 пользователь Krasnikov Alexei
<krasn...@gmail.com> написал:
> void func1()
> {
> ....
> lock (mutex1)
> lock (mutex2)
> ...
> unlock (mutex2)
> unlock (mutex1)
> ...
> }
>
> void func2()
> {
> ....
> lock (mutex2)
> lock (mutex1)
> ...
> unlock (mutex1)
> unlock (mutex2)
> ...
> }
> мютекс - технология, внедрение которой гарантирует что указанный кусок
> кода м каждый момент времени будет выполнятся максимум одним процессом
> исправленная расстановка локов соответствует требованиям технологии
> мьютекс
Ответ неверный. Проблема в том, что порядок блокировки на двух
мьютексах должен быть везде одинаковым, иначе нельзя избежать тупиков:
void func1()
{
....
lock (mutex1)
lock (mutex2)
...
unlock (mutex2)
unlock (mutex1)
...
}
void func2()
{
....
lock (mutex1)
lock (mutex2)
...
unlock (mutex2)
unlock (mutex1)
...
}
--
Sin (Sinelnikov Evgeny)
void func2()
{
....
lock (mutex2)
lock (mutex1)
...
void func1()
{
....
lock (mutex1)
lock (mutex2)
...
unlock (mutex2)
unlock (mutex1)
...
}
void func2()
{
....
lock (mutex1)
lock (mutex2)
...
unlock (mutex2)
unlock (mutex1)
...
}
Ясно, но поздновато...
PS: Я почистил очередь модерации. Если Ваш ответ в группу застрял.
Пишите об этом лично - я забываю проверят эту очередь - уведомления о
модерации где-то теряются, наверное уходят в спам.
--
Sin (Sinelnikov Evgeny)