Многопоточная среда, другие потоки никогда не получают доступ к критическому разделу

Прямо сейчас я застрял, вот что я пытаюсь сделать:

  • Создать 3 темы:
  • Эти 3 потока будут иметь доступ к общему глобальному ресурсу (вектору)

В определенный момент в функции (которую будут вызывать все потоки) будет функция 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;
}

0

Решение

Есть ли какая-либо вероятность сбоя процесса в разделе «// манипулировать глобальными данными»?

Если это так, то LeaveCriticalSection (&obj) никогда бы не назвали.

Вы пытались поместить журналы отладки прямо перед LeaveCriticalSection (&OBJ)?

0

Другие решения

Я думаю, что более склонно к ошибкам использовать scoped-помощники, которые помогают вам в такой ситуации, как «какое-то исключение происходит после EnterCriticalSection () и до LeaveCriticalSection (), так что LeaveCriticalSection () действительно никогда не происходит».

Вы можете сделать некоторую обертку (см. Выше) вокруг CS с некоторой трассировкой.

Кроме того, я предполагаю, что было бы легко собрать дамп приложения и посмотреть через WinDbg текущее состояние потока & cs гос.

0

По вопросам рекламы [email protected]