Многопоточное вытеснение долго выполняющегося методаC++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Многопоточное вытеснение долго выполняющегося метода

Сообщение Anonymous »

Я несколько раз сталкивался со следующей ситуацией (как в C++, так и в Python), и мне интересно, как ее решить:
Я Я работаю с двумя разными библиотеками (поэтому я не могу изменить этот код), каждая из которых предоставляет классы, подобные этим:

Код: Выделить всё

// Call to do the "work"
class LongRunner
{
public:
void runForAwhile();
// Only interrupts runForAwhile() if it is currently running.
// Doesn't do anything otherwise (ie, can still be called)
void stopRunner();
};

// Override to define execution
class ExecutionBase
{
public:
virtual void executeInSeparateThread();
// Joins the execution thread. Can be overridden for additional cleanup.
virtual void halt();
};
Непотокобезопасная версия моего производного класса:

Код: Выделить всё

class MyExecution : ExecutionBase
{
public:
void executeInSeparateThread() override
{
doBeforeThings();
long_runner_.runForAwhile();
doAfterThings();
}

void halt() override
{
long_runner_.stopRunner();
ExecutionBase::halt();
}

private:
LongRunner long_runner_;
};
Библиотека управляет созданием потока выполненияInSeparateThread() и вызовом stop() в другом потоке. Какие блокировки и т. д. я должен использовать, чтобы гарантировать, чтоhalt() всегда правильно прерывает выполнениеInSeparateThread()?
Трюк, который меня сбивает с толку, заключается в том, что stopRunner()< /code> прерывает runForA while(), только если он выполняется в данный момент. Таким образом, если функция stopRunner() вызывается вhalt(), а runForA while() еще не запущена, синхронизация потоков должна гарантировать, что она никогда не запустится.В этом вопросе нет необходимости, но если вам интересно, LongRunner на самом деле является moveit::task_constructor::Task ( и preempt()), а ExecutionBase — BT::ThreadedAction

Подробнее здесь: https://stackoverflow.com/questions/791 ... ing-method
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»