Я пишу приложение, которое должно имитировать поведение ПЛК. Это означает, что мне нужно запустить несколько потоков, чтобы убедиться, что активен только один поток, а все остальные приостановлены. Например:
- поток 1 повторяется каждые 130 мс и блокирует все остальные потоки. Эффективное время выполнения составляет 30 мс, а дополнительные 100 мс перед перезапуском потока могут использоваться другими потоками.
- поток 2 повторяется каждые 300 мс и блокирует все потоки, кроме потока 1. Эффективное время выполнения составляет 50 мс (оставшиеся 250 мс могут использоваться другими потоками). Поток 2 приостанавливается до тех пор, пока поток 1 не завершит выполнение кода (оставшиеся 100 мс потока 1), и как только поток 1 спит, он возобновляется с того места, где он был приостановлен.
- поток 3 повторяется каждые 1000 мс. Эффективное время выполнения составляет 100 мс. Этот поток продолжает выполнение, только если все остальные потоки приостановлены.
Наивысшим приоритетом является завершение задач до того, как они будут вызваны снова, иначе я должен отреагировать, поэтому поток, который должен быть заблокирован, не должен выполняться до определенного момента, иначе многоядерная обработка будет дорабатывать код и ждать только передачи результатов.
Я прочитал несколько сообщений и узнал, что Thread.suspend не рекомендуется, а операции с семафором или монитором означают, что код выполняется до определенной и фиксированной точки в коде, в то время как я должен приостанавливать потоки именно там, где выполнение прибыло, когда другой поток (с более высоким "приоритетом") называется.
Я также просмотрел настройку приоритета, но она не кажется актуальной на 100%, поскольку система может переопределять приоритеты.
Есть ли правильный или хотя бы надежный способ кодирования механизма блокировки?
SleepIfNeeded();
call в код вашего потока. Этот вызов должен ожидать в случае выполнения потока с более высоким приоритетом. Нет необходимости вставлять этот вызов после каждой строки кода, например, вы можете использовать его только перед модификацией общедоступных (наблюдаемых) данных. Будьте осторожны, чтобы использовать этот вызов внутри критических секций, так как это может привести к взаимоблокировке (из-за инверсии приоритета). - person Tsyvarev   schedule 23.06.2015