背景
我目前正在開發一個使用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());
}
}
預先感謝任何幫助。
無關紅旗:您正在使用互斥鎖'm'來保護'QueueSchedule'中的'schedule_queue',但不保存'scheduler'中。我的數據競賽意識刺痛。 – Casey
如果'schedule_queue'是單生產者單消費者隊列,並且您正在使用互斥鎖來同步多個生產者,那麼我的數據競爭感是錯誤的,需要修復。 – Casey