Синхронизационен проблем
12 отговора
833 прегледа
Синхронизационен проблем
Та значи задачата е:
Имаме един двулентов път, по които се движат коли в двете посоки
(да кажем наляво и надясно). На пътя обаче има мост, широк колкото една кола и по него могат да минават коли само от едната посока или само отдругата, докато противоположната посока коли изчакват да минат всички отсрещни коли. Какви синхронизационни обекти ще използвате за управление на трафика през моста в едната и другата посока. Тоест, как ще изглеждат тредовете:
ОООООООООООООООООООООООООООО
Х Х Х Х -> --------- мост-------- <- ХХХХХХХ
ОООООООООООООООООООООООООООО
int ThreadCarТоRight()
.....
int ThreadCarТоLeft()
....
Имаме един двулентов път, по които се движат коли в двете посоки
(да кажем наляво и надясно). На пътя обаче има мост, широк колкото една кола и по него могат да минават коли само от едната посока или само отдругата, докато противоположната посока коли изчакват да минат всички отсрещни коли. Какви синхронизационни обекти ще използвате за управление на трафика през моста в едната и другата посока. Тоест, как ще изглеждат тредовете:
ОООООООООООООООООООООООООООО
Х Х Х Х -> --------- мост-------- <- ХХХХХХХ
ОООООООООООООООООООООООООООО
int ThreadCarТоRight()
.....
int ThreadCarТоLeft()
....
Re: Синхронизационен проблем
koja e taq naivna firma kydeto si dava testovite zadachi 'za vkyshti'?
Re: Синхронизационен проблем
Bih kazal che semaphors praviat tochno tova.
Ima si gotova realizacia za tiah.
Ima si gotova realizacia za tiah.
Re: Синхронизационен проблем
Работата е там, чв не са само семафори, а има 1 мутекс първо, по който всеки преминаващ трябва да изчака и допълнително се използва семафор - даже два семафора за двете посоки - нещо от рода:
int g_carcount = -1;
...
//Moving Left
wait(mitex_move);
InterlockedIncrement(g_carcount);
if(g_carcount == 0) //first car in that direction
wait(semaphore_dir_left);
MoveCarLeft();
InterlockedDecrement (g_carcount);
if(g_carcount < 0) //no cars in that direction anymore
release(semaphore_dir_right) //allow movemеnt in another direction
release(mitex_move);
...
Мисля, че е това, ама не съм го проверявал за deadlock
int g_carcount = -1;
...
//Moving Left
wait(mitex_move);
InterlockedIncrement(g_carcount);
if(g_carcount == 0) //first car in that direction
wait(semaphore_dir_left);
MoveCarLeft();
InterlockedDecrement (g_carcount);
if(g_carcount < 0) //no cars in that direction anymore
release(semaphore_dir_right) //allow movemеnt in another direction
release(mitex_move);
...
Мисля, че е това, ама не съм го проверявал за deadlock
Re: Синхронизационен проблем
Каквото си искаш - мутекси, критични секции, семафори - u name it
ПС. Като те гледам какви въпроси задаваш, май по-добре е да седнеш малко да поучиш (има няма 2-3 годинки), и после да ревеш какви трудни задачи давали по интервютата.
ПС. Като те гледам какви въпроси задаваш, май по-добре е да седнеш малко да поучиш (има няма 2-3 годинки), и после да ревеш какви трудни задачи давали по интервютата.
Re: Синхронизационен проблем
Tova ma nakara da se zamislq... v parviq moment vikam tova prosto - ako e za edna kola (polzvam java che go poznavam nai dobre):
class Bridge {
public synchronized moveCarToRight(Car car) {...}
public synchronized moveCarToLeft(Car car) {...}
}
Samo edna kola na mosta... Ako imame poredici togava moje da razshirim Car do neshto ot toda na CarRow v koqto sedqt vsichki koli v momenta ot ednata strana na mosta... no tova sam go mislil samo kato statichen variant... ami ako taq redica trqbva da se promenq, v smisal dinamichno da se dobavqt koli ??? ami moje i gornoto da svarshi rabota ama oshte ne sam go doobmislil...
class Bridge {
public synchronized moveCarToRight(Car car) {...}
public synchronized moveCarToLeft(Car car) {...}
}
Samo edna kola na mosta... Ako imame poredici togava moje da razshirim Car do neshto ot toda na CarRow v koqto sedqt vsichki koli v momenta ot ednata strana na mosta... no tova sam go mislil samo kato statichen variant... ami ako taq redica trqbva da se promenq, v smisal dinamichno da se dobavqt koli ??? ami moje i gornoto da svarshi rabota ama oshte ne sam go doobmislil...
Re: Синхронизационен проблем
Бих ти препоръчал да ползваш CEvent. Доста по евтино е. Може и за двигателите да ти остане време да синхронизираш.
Re: Синхронизационен проблем
lngon, започваш да напипваш същността на проблема! А пък gruhal нека си груха, че е просто. Да, просто е да сложиш един мутекс и да пускаш само една кола по моста...да, просто е да сложиш по един семафор с броя на колите от дадена страна и да пропускаш n коли от едната посока, после въртиш другата посока - да речем m коли и т.н. Какв обаче става, ако дойдат още коли и трафика е с различна натовареност през деня - че ти се завие главата от превлючване
Номера е да се направи "интелигентен светофар", който "вижда" броя на колите, пуска ги, после, като няма коли от едната страна, пуска тези от другата и т.н. - ситуацията е динамична...
Номера е да се направи "интелигентен светофар", който "вижда" броя на колите, пуска ги, после, като няма коли от едната страна, пуска тези от другата и т.н. - ситуацията е динамична...
Re: Синхронизационен проблем
Какво му е интелигентното? И какъв е проблема.
Като доиде кола, се сигнализира event/condition variable. Заключва се мутекса. Преминават всички коли, чакащи от страната на дошлата кола. Отключва се мутекса.
Като доиде кола, се сигнализира event/condition variable. Заключва се мутекса. Преминават всички коли, чакащи от страната на дошлата кола. Отключва се мутекса.
Re: Синхронизационен проблем
Проблема, Пешо, е само в главата на Друм - "какви синхронизационни примитиви", сега започва да блещи за натовареност на движението, потенциални отвличания от извънземни и роботи бутащи колите по стълби.
Re: Синхронизационен проблем
Ееее някой да внесе здрав разум в дискусията и да покаже, че най-големия примитив (ама наистина примитив) за синхронизация на пътното движение е катаджия размахващ хранилката... опа -- палката. 

--
"Agile is a mindset, not a set of practices, rules, or tools."
Tom Poppendieck
--
"Agile is a mindset, not a set of practices, rules, or tools."
Tom Poppendieck