Новые сообщения [новые:0]
Дайджест
Горячие темы
Избранное [новые:0]
Форумы
Пользователи
Статистика
Статистика нагрузки
Мод. лог
Поиск
|
28.05.2019, 10:34
|
|||
---|---|---|---|
TCriticalSection deadlock |
|||
#18+
Всем привет! Многопоточный код написан в среде 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.
Пример из справочной системы C Builder по работе с TCriticalSection. Методы Acquire() и Enter() аналогичны. Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9.
... |
|||
:
Нравится:
Не нравится:
|
|||
|
28.05.2019, 10:40
|
|||
---|---|---|---|
TCriticalSection deadlock |
|||
#18+
YedИногда, при вызове данных методов (любого из этих двух) возникает deadlock. Примерно 1 раз из 10... Я имел ввиду 1 раз из 10 запусков программы. Т.е. чаще всего программа отрабатывает корректно без блокировки. ... |
|||
:
Нравится:
Не нравится:
|
|||
|
28.05.2019, 10:55
|
|||
---|---|---|---|
|
|||
TCriticalSection deadlock |
|||
#18+
Yed, а инициализацию делал? ... |
|||
:
Нравится:
Не нравится:
|
|||
|
28.05.2019, 10:58
|
|||
---|---|---|---|
TCriticalSection deadlock |
|||
#18+
kealon(Ruslan)а инициализацию делал? Объект секции создается в конструкторе: mAnswerCritSect = new TCriticalSection; других процедур инициализации вроде и не предусмотрено. ... |
|||
:
Нравится:
Не нравится:
|
|||
|
28.05.2019, 11:04
|
|||
---|---|---|---|
|
|||
TCriticalSection deadlock |
|||
#18+
Yed, тогда только отлаживать, лови зависание и аттачся к приложению, смотри внутренние поля структуры скорее всего "кто-то портит" блок RTLCriticalSection ... |
|||
:
Нравится:
Не нравится:
|
|||
|
28.05.2019, 12:52
|
|||
---|---|---|---|
|
|||
TCriticalSection deadlock |
|||
#18+
Yedили проблема вообще в другом? В другом. Что-то криво в коде твоей самопальной секции. Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
|
28.05.2019, 14:35
|
|||
---|---|---|---|
|
|||
TCriticalSection deadlock |
|||
#18+
Dimitry Sibiryakov, да нет, это стандартный класс из VCL, ни разу не видел проблем непосредственно в нём, там простая обёртка над winapi ... |
|||
:
Нравится:
Не нравится:
|
|||
|
28.05.2019, 14:39
|
|||
---|---|---|---|
|
|||
TCriticalSection deadlock |
|||
#18+
Пардон, мне почему-то показалось, что ТС использует свою собственную обёртку вместо VCL-ной. Тогда надо ловить момент дедлока и отладчиком смотреть стэки всех потоков. Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
|
28.05.2019, 14:43
|
|||
---|---|---|---|
|
|||
TCriticalSection deadlock |
|||
#18+
Dimitry Sibiryakov, как вариант может быть что кто-то из потоков попал записал непосредственно в структуру критической секции - т.е. по простому "порча памяти" ... |
|||
:
Нравится:
Не нравится:
|
|||
|
28.05.2019, 15:43
|
|||
---|---|---|---|
TCriticalSection deadlock |
|||
#18+
Yed, С одним обьектом синхронизации дэдлока быть не может. Дэдлок возникает когда есть два обьекта синхронизации и порядок их захвата разный в разных потоках. ... |
|||
:
Нравится:
Не нравится:
|
|||
|
|
start [/forum/topic.php?fid=57&mobile=1&tid=2017612]: |
0ms |
get settings: |
9ms |
get forum list: |
13ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
42ms |
get topic data: |
13ms |
get forum data: |
3ms |
get page messages: |
53ms |
get tp. blocked users: |
2ms |
others: | 283ms |
total: | 426ms |
0 / 0 |