Копаюсь в недрах TNKernel 2.6. В функциях удаления объектов синхронизации (семафор, мютекс) есть такой код (например функция удаления семафора):
Код
....
while(!is_queue_empty(&(sem->wait_queue)))
{
//!!!!!!!!!!!!!!!!!!!!!!!!!!!
tn_disable_interrupt();
//--- delete from the sem wait queue
que = queue_remove_head(&(sem->wait_queue));
task = get_task_by_tsk_queue(que);
if(task_wait_complete(task))
{
task->task_wait_rc = TERR_DLT;
tn_enable_interrupt();
tn_switch_context();
}
}
....
Вопрос такой - а что если переключение контекста произойдет в момент отмеченный восклицательными знаками?
Т.е. очередь sem->wait_queue на момент проверки содержала один элемент, попали в цикл, произошло переключение контекста и из нее удалили единственный элемент. Дальше в коде нигде проверок чт из очереди что-то достали я не нашел.
Или я где-то не правильно рассуждаю?