Фон
В настоящее время я разрабатываю программу, использующую C++ 11 для малины pi. Базовая конструкция (относится к этому вопросу):Принудительная резьба для возврата во время сна
- У меня есть основной цикл, ожидающий команды от внешнего источника.
- В основном цикле я создаю агента (объект, который работает в отдельном потоке), который спит до тех пор, пока в его очередь не будет добавлено что-то, в этом случае оно пробуждается, обрабатывает этот элемент и затем проверяет, есть ли какие-либо элементы в (этот процесс повторяется, если есть больше для обработки)
В «обработке» элемента я просто включаю/выключаю контакты GPIO по одному за X секунд , не
Обработка псевдокод:
for (Pin pin : pins)
{
set_pin(pin, HIGH);
this_thread::sleep_for(chrono::seconds(x))
set_pin(pin, LOW);
this_thread::sleep_for(chrono::seconds(y))
}
Очевидно, что 99,999% времени этой нити будет расходоваться спит (единственный раз, когда он выполняет код будет, когда это установка контактных выходов (нет данных Прикосновение здесь)
Вопрос
Как я должен идти об отмене обработки текущего элемента от основного потока? Я не хочу, чтобы убить нить, когда-либо, я просто хочу, чтобы вернуться в этозапустить цикл для обработки следующего элемента в очереди (или вернуться в режим сна).
Я могу придумать, как это сделать, я просто хотел бы услышать несколько идей от сообщества и выбрать лучшее решение.
Дополнительный код
Это класс работает в отдельном потоке делает обработку элементов в очереди. schedule->RunSchedule(schedule)
- это вызов функции, описанной выше псевдокодом.
ScheduleThread.cpp
#include "ScheduleThread.h"
ScheduleThread::ScheduleThread()
: thread(&ScheduleThread::run, this)
{
}
ScheduleThread::~ScheduleThread() {
// TODO Auto-generated destructor stub
}
void ScheduleThread::QueueSchedule(Schedule *schedule)
{
lock_guard<mutex> lock(m);
schedule_queue.push(schedule);
stateChangedSema.post();
}
bool ScheduleThread::scheduler()
{
if (!schedule_queue.empty())
{
Schedule *schedule = schedule_queue.front();
schedule->RunSchedule();
schedule_queue.pop();
return true;
}
return false;
}
void ScheduleThread::run()
{
for(;;)
{
stateChangedSema.wait();
while (scheduler());
}
}
Заранее спасибо за любую помощь.
неродственных красный флаг: Вы используете mutex 'm' для защиты' schedule_queue' в 'QueueSchedule', но не в' scheduler'. Чувство моих данных горит. – Casey
Если 'schedule_queue' является однопроцессорной однопользовательской очередью, и вы используете мьютекс для синхронизации нескольких производителей, то мой смысл использования данных неверен и нуждается в исправлении. – Casey