Мы программируем проприетарную встроенную платформу, сидящую поверх VxWorks 5.5. В нашем наборе инструментов есть переменная условия, которая реализуется с использованием двоичного семафора VxWorks.
Теперь POSIX предоставляет функцию ожидания, которая также принимает мьютекс. Это разблокирует мьютексы (так, чтобы какая-то другая задача могла записывать данные) и ждет, пока другая задача будет сигнализировать (это делается, записывая данные). Я считаю, что это реализует то, что называется Monitor, ICBWT.
Нам нужна такая функция ожидания, но ее реализация сложна. Простой подход сделает это:
bool condition::wait_for(mutex& mutex) const {
unlocker ul(mutex); // relinquish mutex
return wait(event);
} // ul dtor grabs mutex again
Тем не менее, это спортивное состояние гонки, потому что это позволяет другой задаче вытеснить этот момент после разблокировки и до ожидания. Другая задача может записываться на дату после ее разблокировки и сигнализировать условие до того, как эта задача начнет ждать семафора. (Мы протестировали это, и это действительно произойдет и навсегда заблокирует задачу ожидания.)
Учитывая, что VxWorks 5.5, похоже, не предоставляет API для временного отказа от семафора при ожидании сигнала, есть ли способ реализовать это поверх предоставленных процедур синхронизации?
Примечание.. Это очень старая версия VxWorks, которая была скомпилирована без поддержки POSIX (от поставщика запатентованного оборудования, из того, что я понял).