[RTest] Пробный вопрос

7 views
Skip to first unread message

Evgeny Sinelnikov

unread,
Dec 4, 2010, 8:32:05 PM12/4/10
to saratov-real...@googlegroups.com
Здравствуйте,

я понимаю, что уже очень поздно, поэтому не рассчитываю, что кто-то
собирётся ответить на этот вопрос в течении часа, но тем не менее это
пример, на котором можно потренироваться. Пишите ответы - итоговые
дополнительные баллы, будут начисляться и за активность.

Вопрос [10 баллов]:
Дан пример кода критической секции для двух функций, синхронизрующихся
на общем ресурсе:
void func1()
{
....
lock (mutex1)
lock (mutex2)
...
unlock (mutex1)
unlock (mutex2)
...
}

void func2()
{
....
lock (mutex2)
lock (mutex1)
...
unlock (mutex2)
unlock (mutex1)
...
}

Исправьте ошибки в синхронизации, которые могут приводить к
"потенциальным тупикам", поясните в чём они состоят.

--
Sin (Sinelnikov Evgeny)

Evgeny Sinelnikov

unread,
Dec 5, 2010, 3:39:47 AM12/5/10
to saratov-real...@googlegroups.com
Будем считать, что проба прошла почти успешно. Ответ, конечно, не
верный, но самое главное - его увидел только я, а не вся группа. Чтобы
ответ ушёл в группу в адресе Кому должен быть указан адрес группы:
saratov-real...@googlegroups.com.

Кнопка Ответить или Ответить Всем должны указывать адрес
автоматически, если его там не будет, то не сложно добавить, хотя и
неудобно, но это уже проблема вашего почтового клиента. Вообще я таких
проблем не встречал.

В общем, подытоживая... Засчитываются те ответы, которые пришли в
ответ на моё сообщение в рассылку. Проверить это можно на сайте
группы:
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)

Krasnikov Alexei

unread,
Dec 5, 2010, 2:57:28 AM12/5/10
to Saratov Real Time Systems

void func1()
{
....
lock (mutex1)
lock (mutex2)
...
unlock (mutex2)
unlock (mutex1)
...
}

void func2()
{
....
lock (mutex2)
lock (mutex1)
...

temkin

unread,
Dec 5, 2010, 4:10:29 AM12/5/10
to Saratov Real Time Systems
Ждём следующий вопрос.

Krasnikov Alexei

unread,
Dec 5, 2010, 3:55:51 AM12/5/10
to Saratov Real Time Systems
Я еще раз переделал.
так как первый пытается взять лок, захваченный вторым, а второй -
захваченный первым, то оба потока виснут,поэтому исправил и получилось
вот,так:

void func1()
{
....
lock (mutex1)
lock (mutex2)
...

unlock (mutex2)
unlock (mutex1)
...

}

void func2()
{
....


lock (mutex1)
lock (mutex2)
...

unlock (mutex2)
unlock (mutex1)
...

}

Alexei Krasnikov

unread,
Dec 5, 2010, 4:14:10 AM12/5/10
to Saratov Real Time Systems


Письма.на гугл групс доходит долго я отправил не только вам,а всем на гугл групс,еще скинул еще один ответ на этот вопрос,а он почему то  не дошел во время.



Evgeny Sinelnikov

unread,
Dec 5, 2010, 4:19:21 AM12/5/10
to saratov-real...@googlegroups.com
5 декабря 2010 г. 11:55 пользователь Krasnikov Alexei
<krasn...@gmail.com> написал:

> Я еще раз переделал.
>  так как первый пытается взять лок, захваченный вторым, а второй -
> захваченный первым, то оба потока виснут,поэтому исправил и получилось
> вот,так:
>
> void func1()
> {
> ....
>   lock (mutex1)
>   lock (mutex2)
> ...
>   unlock (mutex2)
>   unlock (mutex1)
> ...
>
> }
>

Ясно, но поздновато...

PS: Я почистил очередь модерации. Если Ваш ответ в группу застрял.
Пишите об этом лично - я забываю проверят эту очередь - уведомления о
модерации где-то теряются, наверное уходят в спам.

--
Sin (Sinelnikov Evgeny)

Reply all
Reply to author
Forward
0 new messages