자체 루프에서 실행될 이벤트 루프 클래스를 만들고 std::functions
과 같은 작업 추가를 지원하고 실행합니다. 이를 위해 , 여기에서 SafeQueue을 사용하고 있습니다 : https://stackoverflow.com/a/16075550/1069662스레드 안전 큐가있는 C++ 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이 루프를 종료 할 수 없습니다.
참고로 유휴/반복 목록도 있으면 도움이 될 것이라고 생각합니다. –
'bool SafeQueue :: try_dequeue (Task & out, std :: chrono :: milliseconds timeout); 또는 이와 비슷한가? –
가능하면 TBB의 [동시 대기열] (http://www.threadingbuildingblocks.org/docs/help/tbb_userguide/Concurrent_Queue_Classes.htm) 컨테이너를 간단한 블로킹 뮤텍스에 의존하는 대신 고성능으로 간주합니다. – sjdowling