Здравствуйте, <Аноним>, Вы писали:
А>Мне нужно, что если метод MethodSynchronized() уже выполнятеся ОДИМ потоком, он не мог выполняться в других. А>НО ПРИ ЭТОМ, "другие" методы, пытающиеся выхвать MethodSynchronized из других потоков, просто дождались выполнения MethodSynchronized() А>И НЕ ЗАПУСКАЛИ его, т.е. просто сделали return.
Здравствуйте, <Аноним>, Вы писали:
А>А вот это уже похоже на то что нужно. И кода совсем немного. А>Надо прикинуть как это влезет в уже существующий код. Спасибо!
Да не за что.
P.S. Для спасибо есть кнопка.
... << RSDN@Home 1.2.0 alpha rev. 786>>
Re[12]: Конкурентный доступ к ManulaResetEvent
От:
Аноним
Дата:
18.03.08 09:01
Оценка:
Здравствуйте, Аноним, Вы писали:
А>Здравствуйте, Lloyd, Вы писали:
L>>Вот так не пойдет? L>>
А>А вот это уже похоже на то что нужно. И кода совсем немного. А>Надо прикинуть как это влезет в уже существующий код. Спасибо!
Что-то вечером вчера я не туда смотрел похоже
Это решение тоже не дает нужного поведения. Ведь когда мы входим в lock, после Monitor.Exit только один поток освободится, а мне надо чтобы освободились все, которые можгут ждать.
В этом варианте, если CallTheBloodyMethod будет вызван из потока в то время, когда он уже выполняется каким-либо другим потоком, этот метод просто завершится, а мне надо чтоб он дождался пока другой поток не закончит его выполнение.
Здравствуйте, <Аноним>, Вы писали:
А>Что-то вечером вчера я не туда смотрел похоже А>Это решение тоже не дает нужного поведения. Ведь когда мы входим в lock, после Monitor.Exit только один поток освободится, а мне надо чтобы освободились все, которые можгут ждать.
Тебе имеет смысл подменять каждый раз объект синхронизации:
т.е. поток выполняющий функцию, создаёт новый объект синхронизации и назначает его в качестве текущего объекта синхронизации. Остальные потоки ожидают освобождения текущего объекта синхронизации.
После того, как функция завершена, поток сбрасывает текущий объект синхронизации в null, а затем освобождает сам объект синхронизации.
Наличие назначенного текущего объекта синхронизации есть признак того, что функция уже выполняется.
Здравствуйте, Аноним, Вы писали:
А>Здравствуйте, GlebZ, Вы писали:
А>А почему ты говоришь что оно должно зависнуть? А>У меня для 10000 потоков отработало нормально.
Там в коде реально баг, и оно может при определнных условиях зависнуть. Может быть ситуация когда поток который выполняет метод DoSmth вызвал PulseAll, но при этом остались потоки, которые еще не вызвали Wait, так вот эти потоки зависнут когда вызовут Wait (если конечно еще раз не вызвать PulseAll).
Re[7]: Конкурентный доступ к ManulaResetEvent
От:
Аноним
Дата:
21.03.08 17:07
Оценка:
Здравствуйте, Александр Малафеев, Вы писали:
АМ>Там в коде реально баг, и оно может при определнных условиях зависнуть. Может быть ситуация когда поток который выполняет метод DoSmth вызвал PulseAll, но при этом остались потоки, которые еще не вызвали Wait, так вот эти потоки зависнут когда вызовут Wait (если конечно еще раз не вызвать PulseAll).
Да, теперь вижу.
Тогда опять получается что кроме как с ManualResetEvent это не решить (хотя там тоже, как видно из первого поста не так все гладко).
Где ж 100% солюшн?