我想創建一個事件循環類,它將在它自己的線程上運行,支持將任務作爲std::functions
添加並執行它們。 對於這一點,我使用的是SafeQueue從這裏:https://stackoverflow.com/a/16075550/1069662C++ 11事件循環與線程安全隊列
class EventLoop
{
public:
typedef std::function<void()> Task;
EventLoop(){ stop=false; }
void add_task(Task t) { queue.enqueue(t); }
void start();
void stop() { stop = true; }
private:
SafeQueue<Task> queue;
bool stop;
};
void EventLoop::start()
{
while (!stop) {
Task t = queue.dequeue(); // Blocking call
if (!stop) {
t();
}
}
cout << "Exit Loop";
}
然後,你會使用這樣的:
EventLoop loop;
std::thread t(&EventLoop::start, &loop);
loop.add_task(myTask);
// do smth else
loop.stop();
t.join();
我的問題是:如何阻止正常的線程? 由於阻塞隊列調用,此處stop不能退出循環。
作爲一個說明,我認爲這也可能有一個'idle/repeat'列表。 – 2014-10-18 17:45:41
是否有'bool SafeQueue :: try_dequeue(Task&out,std :: chrono :: milliseconds timeout);''或類似的? –
2014-10-18 17:48:14
如果可能的話,我還會考慮TBB的[併發隊列](http://www.threadingbuildingblocks.org/docs/help/tbb_userguide/Concurrent_Queue_Classes.htm)容器的高性能,而不是依賴簡單的阻塞互斥體。 – sjdowling 2014-10-18 19:54:14