Мой ответ «не пытайтесь сделать это».
Конечно, вы, вероятно, можете найти какой-нибудь хак, который будет работать в вашем конкретном случае.Но условия гонки здесь очень трудно исправить.
Очевидный подход состоит в том, чтобы поток A
сделал блокирующий вызов, а затем настроил поток B
для уничтожения A
, если время ожидания истекло.
Но ... Что если время ожидания истечет в то же время, когда A
возвращается из блокирующего вызова?В частности, что если B
думает, что настало время убить A
, то ваш планировщик ОС некоторое время решает запустить A
, а затем ваша ОС решает запустить код B
, который убиваетA
?
Итог: вы убиваете A
в какой-то неопределенной точке его исполнения.(Например, возможно, он только что вычел $ 500 со сберегательного счета, но еще не добавил $ 500 к текущему счету. Возможности бесконечны ...)
ОК, так что вы можете создать поток A
дляединственная цель запуска библиотечного вызова, а затем сигнализировать условие или что-то еще, когда он заканчивается.По крайней мере, это можно сделать в принципе.Но даже тогда, что, если у самой библиотеки есть какое-то внутреннее состояние, которое остается в несогласованном состоянии, должно A
быть убитым в неподходящий момент?
Есть веские причины, по которым асинхронное аннулирование потока было исключено из C ++11 стандарт.Просто сказать нет.Исправьте библиотечную рутину.Сколько бы это ни стоило, в долгосрочной перспективе это почти наверняка дешевле, чем вы пытаетесь.