cdtyjv |
---|
2) Поток 1 проверяет, что было записано в файл последний раз. 2.1) Если ничего, или же последним писал поток 2 - то записать свою строку. 2.2) Если же последний раз писал этот же поток, то отпустить мьютекс, и ждать, пока второй поток что-то не запишет. |
Я думал об этом варианте решения в процессе написания кода, но полагал, что мьютекса в данном случае будет достаточно. Мой текущий выбор был обусловлен следующими соображениями:
1. Launcher.exe запускает оба процесса, и они
оба моментально "замирают в ожидании", дойдя до строчки кода
mutex.WaitOne();
2. После того, как Launcher.exe освобождает мьютекс
mutex.ReleaseMutex();
Его тут же захватывает любой из ожидающих процессов и выполняет
один виток в цикле. В коде этого цикла, сразу после освобождения мьютекса, присутствует строка
Thread.Sleep(0);
Её задача - не дать потоку данного процесса сразу пойти на очередной виток (это возможно, т.к. мьютекс освобождён), но вместо этого выполнить переключение исполняемых потоков (в данном случае на поток, выполняемый в др. процессе), при условии что их несколько.
Мои предположения о причине проблемы в текущем коде были следующими:
1. Возможно один из процессов не успевает дойти до точки
mutex.WaitOne();
в то время как в коде Launcher.exe мьютекс уже освобождён. Для решения этого я пробовал в Launcher.exe, перед освобождением мьютекса ставить такой код:
Thread.Sleep(100);
чтобы оба процесса успели дойти до "нужной кондиции". Однако это не помогло.
2. Возможно метод
Thread.Sleep(0);
ориентирован на переключение потоков в рамках одного процесса.
P.S. Спасибо за ответ, добавлю в код conditional variable.