Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / C++ [игнор отключен] [закрыт для гостей] / TCriticalSection deadlock / 11 сообщений из 11, страница 1 из 1
28.05.2019, 10:34
    #39819120
Yed
Yed
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
TCriticalSection deadlock
Всем привет!
Многопоточный код написан в среде C++Builder. Используется обертка над крит. секциями TCriticalSection.
Есть два метода, которые имеют доступ к общему ресурсу - вектору.
Метод AddAnswer() вызывается в потоках и добавляет результат своей работы в вектор.
Метод GetAnswer() периодически вызывается в основном потоке приложения для разбора накопившейся очереди (пока всю не выберет, до NULL).
Иногда, при вызове данных методов (любого из этих двух) возникает deadlock. Примерно 1 раз из 10...

Не могу сообразить, как может быть пропущен вызов метода Release() или проблема вообще в другом?

Код во всех секциях __finally срабатывает при любом выходе из процедуры (проверено отладчиком для разных комбинаций). Крит. секция нигде более не используется, доступ к вектору только через эти 2 метода. TThreadManager создается в одном экземпляре. Число потоков от 10 до 50.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
void TThreadManager::AddAnswer(TAnswer *AAnswer){
  mAnswerCritSect->Enter();
  try{
    mAnswers.push_back(AAnswer);
  }
  __finally{
    mAnswerCritSect->Release();
  }
}

TAnswer* TThreadManager::GetAnswer(){
  mAnswerCritSect->Enter();
  try{
    if (mAnswers.size() == 0)
      return NULL;
    TAnswer* answer = mAnswers.back();
    mAnswers.pop_back();
    return answer;
  }
  __finally{
    mAnswerCritSect->Release();
  }
}



Пример из справочной системы C Builder по работе с TCriticalSection.
Методы Acquire() и Enter() аналогичны.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
pLockXY->Acquire(); // lock out other threads
try
{
  Y = sin(X);
}
__finally
{
  pLockXY->Release();
}
...
Рейтинг: 0 / 0
28.05.2019, 10:40
    #39819121
Yed
Yed
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
TCriticalSection deadlock
YedИногда, при вызове данных методов (любого из этих двух) возникает deadlock. Примерно 1 раз из 10...
Я имел ввиду 1 раз из 10 запусков программы. Т.е. чаще всего программа отрабатывает корректно без блокировки.
...
Рейтинг: 0 / 0
28.05.2019, 10:55
    #39819135
kealon(Ruslan)
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
TCriticalSection deadlock
Yed,

а инициализацию делал?
...
Рейтинг: 0 / 0
28.05.2019, 10:58
    #39819140
Yed
Yed
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
TCriticalSection deadlock
kealon(Ruslan)а инициализацию делал?
Объект секции создается в конструкторе:
mAnswerCritSect = new TCriticalSection;

других процедур инициализации вроде и не предусмотрено.
...
Рейтинг: 0 / 0
28.05.2019, 11:04
    #39819147
kealon(Ruslan)
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
TCriticalSection deadlock
Yed,

тогда только отлаживать, лови зависание и аттачся к приложению, смотри внутренние поля структуры
скорее всего "кто-то портит" блок RTLCriticalSection
...
Рейтинг: 0 / 0
28.05.2019, 12:52
    #39819252
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
TCriticalSection deadlock
Yedили проблема вообще в другом?

В другом. Что-то криво в коде твоей самопальной секции.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
28.05.2019, 14:35
    #39819324
kealon(Ruslan)
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
TCriticalSection deadlock
Dimitry Sibiryakov,

да нет, это стандартный класс из VCL, ни разу не видел проблем непосредственно в нём, там простая обёртка над winapi
...
Рейтинг: 0 / 0
28.05.2019, 14:39
    #39819329
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
TCriticalSection deadlock
Пардон, мне почему-то показалось, что ТС использует свою собственную обёртку вместо
VCL-ной. Тогда надо ловить момент дедлока и отладчиком смотреть стэки всех потоков.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
28.05.2019, 14:43
    #39819337
kealon(Ruslan)
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
TCriticalSection deadlock
Dimitry Sibiryakov,
как вариант может быть что кто-то из потоков попал записал непосредственно в структуру критической секции - т.е. по простому "порча памяти"
...
Рейтинг: 0 / 0
28.05.2019, 15:43
    #39819399
OoCc
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
TCriticalSection deadlock
Yed,

С одним обьектом синхронизации дэдлока быть не может.
Дэдлок возникает когда есть два обьекта синхронизации и порядок их захвата разный в разных потоках.
...
Рейтинг: 0 / 0
31.05.2019, 11:42
    #39820656
Yed
Yed
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
TCriticalSection deadlock
После множества перепроверок, ради эксперимент, отказался от билдеровкой конструкции
Код: plaintext
1.
2.
3.
4.
5.
  
try{
}
__finally{
}



проблема сразу исчезла...
...
Рейтинг: 0 / 0
Форумы / C++ [игнор отключен] [закрыт для гостей] / TCriticalSection deadlock / 11 сообщений из 11, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]