PDA

Просмотр полной версии : N потоков на одну функцию... йо-хо-хо, и бутылка рому :)



krieger
18.10.2004, 17:11
Вопрос: например, надо, чтобы Нное кол-во потоков периодически обращались к некоторой функции. Например, считывать новое задание.
Главное - чтобы несколько потоков не получили одно и то же. Я так подумал - наверное, можно реализовать так:



//global
int busy;
int f(char* str/*скажем; туда будем помещать задание*/)
{
if (busy == 1) return false;

busy = 1;
{
/*извлекание следующего задания*/
}
busy = 0;
}


Может, у кого-то есть замечания или лучшие предложения?

Slaventius
18.10.2004, 18:23
Замечание: при такой организации - стабильности не будет. Потому что операция:


if (busy == 1) return false;
busy = 1;

должна выполнятся атомарно.
В твоем же случае поток при выполнении busy=1 может быть прерван так и не "доприсвоив" 1, а в это время второй поток запросто пройдет проверку if (busy==1) и в результате будешь иметь несколько потоков разоряющихся над одним заданием. Само собой, чем больше будет потоков, тем веселее будет "совместная" работа.

Предложение: почитать про критические секции, семафоры и прочие стандартные средства синхронизации.

krieger
18.10.2004, 18:42
Ну, да.
А как-то проще атомарность не достигается?
Ну ладно, спасибо, пойду почитать.
Спасибо.

Яр
19.10.2004, 17:40
Есть такие алгоритмы Деккера и Петерсона. Проблема состоит в том, чтобы обеспечить взаимоисключения. Тоесть, чтобы один из процессов вращался в цикле ожидания, пока другой выполняет критические инструкции..

или можно сделать ещё по другому: запретить прерывания, выполнить критические инструкции, и снова разрешить прерывания. Но это не безопасно :)

зы: вот только одно мне не понятно... если в алгоритме Петерсона в процессе, который находится в критическом разделе произойдёт сбой, то другой останется навсегда заблокированным? :) Вроде такого происходить не должно..

Slaventius
19.10.2004, 20:38
Зависит от конкретной реализации и обговореных действиях, выполняемых при обнаружении сбоя.

krieger
20.10.2004, 15:13
Почитал про юниксовые треды.
Можно ли сделать так: первый поток, добравшийся до функции, блочит спец. функцией все остальные (их немного) пока выполняются критические действия. Потом - разблочивает. Вроде должно работать...

Slaventius
20.10.2004, 18:45
Ну а что по твоему критические секции делают? Блочат.. хех.. И разблочивают. :)

krieger
20.10.2004, 19:30
Ээ... я вообще не в курсе, что это за зверь такой - критические секции. Может, просветишь?

Яр
20.10.2004, 19:38
Критичиский раздел - В асинхронной процедуре компьютерной программы - часть, которая не может выполняться одновременно со связанным критическим разделом другой асинхронной процедуры. (Вильям Столлингс)
:)

krieger
20.10.2004, 20:57
То есть, вещь абсолютно абстрактная?
Иль есть фишка навроде


critical void* fubc(void*) {/**/}
шучу, конечно :) не козлить.

Яр
20.10.2004, 21:06
Насколько я понимаю, да, тобишь абстрактная :)

Slaventius
21.10.2004, 12:16
Но есть и конкретные реализации.

krieger, не зли меня :) Иди читай, пока тебя не вздернули на рее :) Йо-хо-хо :)

krieger
21.10.2004, 15:27
Всё, ша! Уже и пошутить в родном городе нельзя!
ЗЫ Злой ты какой-то, Слав... Вот что делает с людьми власть :)
ЗЗЫ "Базар", я надеюсь, закончен. Вопрос уяснён, всем спасибо за винимание.
EOF

Slaventius
22.10.2004, 00:42
Я не злой. Просто ты еще ленивей меня. А это уже порок. :)