Прервать поток, выполняющий MKL или другую стороннюю функцию

¿Как я могу прервать поток, который выполняет подпрограмму MKL? А в других сторонних библиотеках? Мои потоки создаются с помощью Boost :: Thread, и обычно я использую прерывания, чтобы остановить свои потоки (http://www.boost.org/doc/libs/1_41_0/doc/html/thread/thread_management.html#thread.thread_management.interruption), но как я могу остановить поток, выполняющий код MKL? Есть идеи?

заранее спасибо

1

Решение

В двух словах: вы не можете.

Точки прерывания потока, используемые Boost, должны использоваться совместно, то есть код, который должен быть прерван, должен добровольно вызывать вызов функции, который может действовать как точка прерывания. Поскольку MKL этого не делает, вам не повезло.

Лучший способ решить эту проблему — разделить вашу проблему на небольшие порции, которые не требуют много времени для выполнения, а затем проверить запросы на прерывание между обработками порций.

Для полноты: некоторые API допускают отмену потоков методом грубой силы, для которых не требуется разрешение отмененного потока (Boost не является одним из них). Тем не менее, это довольно опасно для использования, так как отмененный поток обычно не может очистить должным образом и, таким образом, может легко оставить программу в поврежденном состоянии. Если вы решите пойти по этому пути, вероятно, лучше использовать разные процессы, а не потоки, поскольку принудительное уничтожение процесса гораздо менее подвержено ошибкам, чем уничтожение потоков.

3

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

Других решений пока нет …

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