В условии "одновременно" не фигурировала ни в какой форме. И это невозможно в принципе (если не брать в учет многоядерность). Все равно это спор ниочем. Сферического коня в вакууме мерять тяжело и безсмысленно.
Ation В условии фигурировал термин барьер. Надо ли проводить ликбез и объяснять что это такое, или достаточно будет послать в гугл? Кстати, если бы вы читали топик, то вы бы заметили, что в нём обсуждалось легитимность использования слова "одновременно". И более того, даже придумали в каком смысле это слово можно употреблять, а в каком смысле -- не стоит. Но помимо этого, ваш код неверен ещё и по другой причине. Если поток Y пройдя ваш "барьер" задумает изменить значения a и b (в условии об этом ничего не говорилось, поэтому предполагаем худшее, что именно этими изменениями Y и займётся в первую очередь), и поток X подойдёт к барьеру после этих изменений, то у X будут шансы остаться у этого барьера навсегда.
r90 В первой половине всё верно, но вот со второй не согласен: Несмотря на то, что в моей практической задаче так и есть, этим аргументом можно убить любое решение, т.к. если принять возможность произвольного динамического изменения синхронизирующих переменных за пределами барьера, поток, вышедший из барьера первым, теоретически всегда может заставить второй поток навсегда остановиться в своей функции ожидания. Например, если в #22 поток Y первым выйдет из wait(b,10) (при этом X мог ещё даже не войти в свой wait), выполнит write(a,10), а потом тут же перезапишет a другим значением, поток X может так и не пройти свой wait. Кроме того, в такой постановке один из потоков также теоретически может оперировать значениями a и b ещё до входа в свой барьер таким образом, что другой поток пройдёт свой барьер не останавливаясь. Поэтому, хотя в условии и сказано, что "начальные значения переменных a и b неизвестны и могут быть любыми", неявно принято, что за пределами барьеров они не меняются (по крайней мере нигде не сказано, что допустимо обратное). В противном случая задача действительно в общем случае нерешаема.
А такое решение не подойдёт? A: Код (Text): write(a, 13) wait(b,13) write(a, 0) wait(b, 0) <your code here> write (a, 666) wait(b, 10) B: Код (Text): write(b, 13) wait(a,13) write(b, 0) wait(a,0) <your code here> wait (a, 666) write(a, 10) write(b, 10)