fk0, легенда (17.11.2015 12:15, просмотров: 689) ответил LightElf на Не совсем понял. Блокироваться можно по времени, а можно ожидать события. Событие может сигнализироваться из обработчика прерывания. В обновленной test_ct используется отдельный виндовый поток для эмуляции прерываний. Т.е. CThreads крутятся в
Не нужно тянуть семафоры, мьютексы и т.п. из полноценной многозадачной ОС. Тебе нужен ровно один примитив -- "событие". Которое или произошло, или нет (бит). По нему и будить (у тебя ж собственно и сделана побудка по указателю на void*) Событие может быть статическим объектом в памяти, чтоб не выдумывать enum'ов. Просто задекларировал и оно есть. На таком механизме можно построить conditional variable, если добавить мьютекс. Но тебе мьютекс в кооперативной ОС не нужен, вместо мьютекса нужна критическая секция (запрет прерываний и восстановление потом), чтоб в прерывание не вовремя не попасть. Т.е. критическая секция совмещённая с побудкой задачи. Пробудился -- и сразу в критической секции, где проверяешь какие угодно переменные любых типов, запоминаешь результат, завершаешь критическую секцию, и дальше либо действия какие-то предпринимаются, либо засыпает до следующей побудки, если условия не те. Какие угодно переменные -- это могут быть от битовых флагов (возможно CPU их позволит без критических секций даже) до fifo-буферов и т.п.
[ZX]