У меня перед глазами решение в нашей библиотеке, но оно закрытое. Просто устроено чуть иначе, чем у вас, поэтому все задачи решаются.
Вы же сами верно сказали — либо двумя, либо одной + условная(ые) переменные.
Вы совсем не слышите, что вам говорят. В момент перехвата читателем и в момент его отпуска нет никаких ожидающих писателей. Либо есть ожидающий писатель, но не исходный, а другой — тоже перехвативший управление.
В каждый момент времени у вас все данные защищены критической секцией. Не может никто внезапно «тоже» перехватить управление. Если у вас другой поток просит дать ему право читать/писать, блокировка имеет право ему отказать на время. Будится за раз только один ожидающий записи спящий поток, пусть их хоть десяток, на чтение — все.
Либо вы что-то не понимаете в многопоточности, либо мои понятия о ней устарели. Счетчик вас не спасет, потому что читатель может перехватить управление несколько раз подряд, успешно обнулив счетчик.
Несколько раз подряд не может — один и тот же поток всегда сначала отпускает блокировку перед тем, как попытаться захватить ее снова.
Честно говоря, дискуссия теряет смысл, потому что вы продолжаете твердить свое, придумывая одну идею за другой. Предлагаю вам представить ваше решение проблемы, тогда будет предмет для конструктивного обсуждения.
Да нет, просто вы решаете задачу несколько иначе.
Я не могу полностью дать вам код, но часть — BeginWrite с купюрами выглядит так:
MustWait := False;
EnterCriticalSection(Lock);
try
ThreadId := GetCurrentThreadId;
Index := FindThread(ThreadId);
if Index < 0 then
begin
// Request to write (first time)
AddToThreadList(ThreadId, False);
if State = 0 then
begin
// unowned so start writing
State := -1;
end
else
begin
// owned, must wait
Inc(WaitingWriters);
MustWait := True;
end;
end
else
begin
...
...
end;
finally
LeaveCriticalSection(Lock);
end;
if MustWait then
WaitForSingleObjectEx(SemWriters, INFINITE, True);
....
....
procedure Release
if State = 0 then
ReleaseWaiters(WasReading);
procedure ReleaseWaiters
... если решили дать зеленый свет писателям:
State := -1;
Dec(WaitingWriters);
ReleaseSemaphore(SemWriters, 1, nil);
Внутренее состояние атомарно — State указывает, захвачен ли ресурс на чтение (и скольки потоками сразу), запись, или свободен. Учитывается кол-во ожидающих писателей, за раз отпускается только один пишущий поток.
Родители куда смотрят, если их ребенок не может 100 метров пробежать? Точно же что-то со здоровьем не так.
Нужна возможность распоряжаться собственными временем и деньги, чего у 5-клашек обычно нет.
Давайте остановимся на том, что все настолько по-разному в разных семьях, что даже обсуждать нечего. Мой основной посыл в том, что ситуация у комментатора была ненормальная чисто с точки зрения здоровья, и учитель там ни при чем.
Да-да, конечно же, 10-11 лет — самое время чтобы принимать решение о самостоятельных тренировках.
5 класс это 11-12 скорее всего. Да, это самое время, чтобы принимать решения о тренировках. Кроме того, есть родители, которые могут помочь юному созданию с мотивацией по этому вопросу. Или если у человека проблемы со здоровьем, что он 100 метров (!!!!!) пробежать не может, это должен не, скажем, врач-терапевт по настоянию родителей решать, а физрук?
Обратите внимание на эту фразу: «Даже родители чморили, «учитель врать не будет, ты просто прикидываешься».» Не отвести человека к врачу, не объяснить, что надо тренироваться, не отдать куда-нибудь на ЛФК, а чморить. Но виноват, конечно, физрук. Рука-лицо.
10-11 лет — уже что-то в голове есть. Да и человек пишет, что у него так до аттестата пошло, т.е. уже ни о каких 11 годах речь не идет, если до выпускного класса дошло. Нам физрук всегда говорил — ребята, будут зачеты, нормативы вот такие-то. Если вы видите, что не тянете (отжимания, например) — тренируйтесь дома дополнительно.
Особенно когда в мозгу уже прочно засела установка «физкультура — это когда у тебя ничего не получается и на тебя кричат».
М — мотивация. Делай так, чтобы получалось. Тренируйся, лечись.
Кричать на учеников из-за того, что у них не получается — убого, такой педагог — плох.
Потренироваться дома, самому? Нееет, физрук — негодяй. Я не могу представить себе такого домоседа (я — типичный домосед, например, но в школе все нормативы сдал без проблем, не считая метания — руки слабоваты), который не сможет пробежать стометровку.
Если, судить по воплям, то конкуренции с приезжими не выдерживаешь
Скорее всего, так и есть. Я в свое время тоже был понаехавшим на учебу в Питер, и то, что приезжие более активные, было видно. Они более легки на подъем, легче кооперируются для решения повседневных задач по учебе, более сплоченны. Ну а необходимость проживать в общежитии и, как минимум, самому себя обстирывать-кормить, договариваться с соседями и тп сильно способствует становлению характера.
Чисто в силу устройства экономики это не могло иметь такой же масштаб. Взять хотя бы отдельные контуры обращения денег — все дельцы-цеховики крутились либо у колхозов, где можно было урвать живые деньги, либо позже у кооперативов, где можно было обналичивать. А кроме этого — никак.
Тем не менее, эта задача решается с одной блокировкой.
то опять же, все возвращается к тому случаю, когда управление может перехватить читатель.
Это не должно влиять на ожидание писателем, он будет по-прежнему в очереди. При выполнении операции «отпуск» мы видим, что у нас есть ожидающий писатель, и можем разбудить его. Или же читателя в противном случае.
Если после отпускания секции и перед началом ожидания события сперва встрянет читатель, то он скинет этот флаг при разблокировке
Объективно в среднем лучше жить в богатой стране не в блокаде — просто уровень жизни выше даже с учетом капиталистического ограбления. Но это не значит, что вторая — плохая или «не права», потому что условия сравнения заведомо нечестные.
и тут же другой писатель может перехватить контроль. В итоге первый писатель может остаться ждать в тот момент, когда читателей и писателей реально нет
Почему, если у нас выставлен флаг waitingWriter? Второй писатель не должен получить доступ, раз уже есть один ожидающий — он должен сам свалиться в Wait, а тем временем будет разбужен первый писатель.
использовать за основу постороннюю платформу, на закрытых технических решениях, с наработками, которыми ни кто, по своей воле не собирался делиться, и заведомо устаревшими образцами для изучения (см. CoCom), не может быть грамотным решением.
Других не было. Тем не менее, образцы были получены, изучены и повторены. Программное обеспечение получалось тоже, сама возможность запустить любое ПО полученное любым путем ценна.
моча в голову отказаться от собственных разработок и начать копировать западные, вполне возможно, что сейчас «англоговорящие» работали бы на «элбрусах», МИРах или «Сетунях» и пользовались бы сетевыми протоколами для стран СЭВ.
Проблема в том, что наши машины зачастую — совершенно несовместимы, вплоть до того, то несовместимы две версии одной машины, что приводит к необходимости постоянно разрабатывать то же матобеспечение по кругу. Необходимость в универсальной платформе — была, и решение взять за основу существующую на западе с прицелом на использование их наработок — в принципе грамотное. Вот обделение/сворачивание своих разработок при этом — другой вопрос.
У меня перед глазами решение в нашей библиотеке, но оно закрытое. Просто устроено чуть иначе, чем у вас, поэтому все задачи решаются.
Вы же сами верно сказали — либо двумя, либо одной + условная(ые) переменные.
В каждый момент времени у вас все данные защищены критической секцией. Не может никто внезапно «тоже» перехватить управление. Если у вас другой поток просит дать ему право читать/писать, блокировка имеет право ему отказать на время. Будится за раз только один ожидающий записи спящий поток, пусть их хоть десяток, на чтение — все.
Несколько раз подряд не может — один и тот же поток всегда сначала отпускает блокировку перед тем, как попытаться захватить ее снова.
Да нет, просто вы решаете задачу несколько иначе.
Я не могу полностью дать вам код, но часть — BeginWrite с купюрами выглядит так:
Внутренее состояние атомарно — State указывает, захвачен ли ресурс на чтение (и скольки потоками сразу), запись, или свободен. Учитывается кол-во ожидающих писателей, за раз отпускается только один пишущий поток.
Давайте остановимся на том, что все настолько по-разному в разных семьях, что даже обсуждать нечего. Мой основной посыл в том, что ситуация у комментатора была ненормальная чисто с точки зрения здоровья, и учитель там ни при чем.
5 класс это 11-12 скорее всего. Да, это самое время, чтобы принимать решения о тренировках. Кроме того, есть родители, которые могут помочь юному созданию с мотивацией по этому вопросу. Или если у человека проблемы со здоровьем, что он 100 метров (!!!!!) пробежать не может, это должен не, скажем, врач-терапевт по настоянию родителей решать, а физрук?
Обратите внимание на эту фразу: «Даже родители чморили, «учитель врать не будет, ты просто прикидываешься».» Не отвести человека к врачу, не объяснить, что надо тренироваться, не отдать куда-нибудь на ЛФК, а чморить. Но виноват, конечно, физрук. Рука-лицо.
10-11 лет — уже что-то в голове есть. Да и человек пишет, что у него так до аттестата пошло, т.е. уже ни о каких 11 годах речь не идет, если до выпускного класса дошло. Нам физрук всегда говорил — ребята, будут зачеты, нормативы вот такие-то. Если вы видите, что не тянете (отжимания, например) — тренируйтесь дома дополнительно.
М — мотивация. Делай так, чтобы получалось. Тренируйся, лечись.
Кричать на учеников из-за того, что у них не получается — убого, такой педагог — плох.
Скорее всего, так и есть. Я в свое время тоже был понаехавшим на учебу в Питер, и то, что приезжие более активные, было видно. Они более легки на подъем, легче кооперируются для решения повседневных задач по учебе, более сплоченны. Ну а необходимость проживать в общежитии и, как минимум, самому себя обстирывать-кормить, договариваться с соседями и тп сильно способствует становлению характера.
Это несопоставимые временные/технологические разрывы, тут вы преувеличиваете, если не сказать более прямо.
Я вроде по-русски написал:
Чисто из любопытства — а откуда вы это знаете? Ну, то, что это «всем известно» — понятно, а все же?
Это не должно влиять на ожидание писателем, он будет по-прежнему в очереди. При выполнении операции «отпуск» мы видим, что у нас есть ожидающий писатель, и можем разбудить его. Или же читателя в противном случае.
Нужен счетчик, а не флаг в таком случае.
Почему, если у нас выставлен флаг waitingWriter? Второй писатель не должен получить доступ, раз уже есть один ожидающий — он должен сам свалиться в Wait, а тем временем будет разбужен первый писатель.
Других не было. Тем не менее, образцы были получены, изучены и повторены. Программное обеспечение получалось тоже, сама возможность запустить любое ПО полученное любым путем ценна.
… а англоязычных в среднем больше, чем русскоязычных, просто в силу распространенности языка в IT.
Проблема в том, что наши машины зачастую — совершенно несовместимы, вплоть до того, то несовместимы две версии одной машины, что приводит к необходимости постоянно разрабатывать то же матобеспечение по кругу. Необходимость в универсальной платформе — была, и решение взять за основу существующую на западе с прицелом на использование их наработок — в принципе грамотное. Вот обделение/сворачивание своих разработок при этом — другой вопрос.
Ну или между кафедрами авионики, двигателистов и планера в авиационном институте?