Прямо сейчас я застрял, вот что я пытаюсь сделать:
В определенный момент в функции (которую будут вызывать все потоки) будет функция Sleep (time), которая заставляет поток спать, функция не возвращается. Здесь я хочу, чтобы другой поток — поток 2, получил доступ и использовал функцию, изменяя глобальную переменную, пока она не спит, чтобы поток 3 мог получить доступ к функции, т. Д …
Функция «критическая секция», которая обращается к глобальной переменной, имеет неопределенное время доступа, она никогда не бывает прежней.
Изначально в основном я звоню
InitializeCriticalSection(&m_stCriticalSection);
Я пытался, когда эта функция вызывается, я немедленно вызываю
EnterCriticalSection(&m_stCriticalSection);
Затем я изменяю глобальные переменные и т. Д., Затем перед сном (время), которое я вызываю
LeaveCriticalSection(&m_stCriticalSection);
Проблема в том, что другие потоки никогда не получают доступ к функции, даже если я ее оставлю.
Могут ли другие мои потоки постоянно или даже каждые 5 секунд получать доступ к критическому разделу? Может ли моя реализация быть лучше?
Так вот что у меня сейчас
void function() // all our threads will access this
{
EnterCriticalSection(&obj)
// manipulate global data
LeaveCriticalSection(&obj)
Sleep(long time) // another thread SHOULD NOW have access to this section!
return true;
}
Есть ли какая-либо вероятность сбоя процесса в разделе «// манипулировать глобальными данными»?
Если это так, то LeaveCriticalSection (&obj) никогда бы не назвали.
Вы пытались поместить журналы отладки прямо перед LeaveCriticalSection (&OBJ)?
Я думаю, что более склонно к ошибкам использовать scoped-помощники, которые помогают вам в такой ситуации, как «какое-то исключение происходит после EnterCriticalSection () и до LeaveCriticalSection (), так что LeaveCriticalSection () действительно никогда не происходит».
Вы можете сделать некоторую обертку (см. Выше) вокруг CS с некоторой трассировкой.
Кроме того, я предполагаю, что было бы легко собрать дамп приложения и посмотреть через WinDbg текущее состояние потока & cs гос.