boost :: this_thread :: interrupt_point () не генерирует boost :: thread_interrupted & amp; исключение

Я хочу прервать поток, используя boost :: thread interrupt (). У меня есть следующий код, который не бросает boost :: thread_interrupted& исключение:

int myClass::myFunction (arg1, arg2) try{
//some code here
do {
boost::this_thread::interruption_point();
//some other code here
} while (counter != 20000);
}catch (boost::thread_interrupted&) {
cout << "interrupted" << endl;
}

Если я заменю boost :: this_thread :: interrupt_point () на boost :: this_thread :: sleep (boost :: posix_time :: milliseconds (150)), исключение — throw и прерывание работает как должно.

Может кто-нибудь объяснить, почему boost :: this_thread :: interrupt_point () не генерирует ожидаемое исключение?

2

Решение

Как отметил комментатор, нет способа исключить простое состояние гонки (во многом зависит от вашей архитектуры и нагрузки на процессор). Тот факт, что добавление явного сна «помогает», подчеркивает это.

Вы работаете в одноядерной системе?

Вот простой самодостаточный пример, если вы замечаете что-то, что делаете по-другому. Смотрите этот простой тестер:

#include <iostream>
#include <boost/thread.hpp>

struct myClass {
int myFunction(int arg1, int arg2);
};

int myClass::myFunction (int arg1, int arg2)
{
int counter = 0;
try
{
//some code here
do {
boost::this_thread::interruption_point();
//some other code here
++counter;
} while (counter != 20000);
} catch (boost::thread_interrupted&) {
std::cout << "interrupted" << std::endl;
}
return counter;
}

void treadf() {
myClass x;
std::cout << "Returned: " << x.myFunction(1,2) << "\n";
}

int main()
{
boost::thread t(treadf);
//t.interrupt(); // UNCOMMENT THIS LINE
t.join();
}

Это печатает

Returned: 20000

Или, если вы раскомментируете строку t.interrupt()

interrupted
Returned: 0

На моей системе i7. Видеть это Жить на Колиру

5

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


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