У меня есть приложение, которое запускает несколько потоков, которые иногда отменяются. Эти потоки могут вызывать другой объект, который внутренне обращается к ресурсам (сокету). Чтобы предотвратить одновременный доступ к ресурсу, существует критическая секция для получения порядка выполнения.
Теперь, при отмене потока, (иногда) случается, что поток находится именно в том коде, который заблокирован критической секцией. Критическая секция заблокирована с помощью объекта, и я надеялся, что после отмены потока этот объект будет разрушен и, следовательно, снимет блокировку. Однако, похоже, это не так, поэтому при уничтожении потока этот объект ресурса постоянно блокируется.
Изменение объекта ресурса, вероятно, не является опцией (поставляется третьей стороной), плюс имеет смысл предотвратить одновременный доступ к ресурсу, который нельзя использовать параллельно.
Я экспериментировал с предотвращением отмены потока, используя pthread_setcancelstate, когда секция заблокирована / разблокирована, однако это выглядит немного грязно и не будет окончательным решением для других ситуаций (например, мьютексов, получаемых в результате сбора, и т. Д.).
Я знаю, что предпочтительным решением было бы не использовать pthread_cancel, а вместо этого установить флаг в потоке, и он отменит себя, когда будет готов (чистым способом). Однако, поскольку я хочу отменить тему как можно скорее, мне стало интересно (также из академического интереса), будут ли другие варианты для этого.