Advertisement
Guest User

Untitled

a guest
Jun 20th, 2019
61
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.06 KB | None | 0 0
  1. struct WorkingQueue{
  2. WorkingQueue()=default;
  3.  
  4. void push(std::function<void()> task){
  5. std::lock_guard<std::mutex> lock{mutex};
  6. queue.push(std::move(task));
  7. }
  8.  
  9. std::optional<std::function<void()>> popIfNotEmpty(){
  10. std::lock_guard<std::mutex> lock{mutex};
  11. if(queue.empty()){
  12. return std::nullopt;
  13. }
  14. auto task = queue.front();
  15. queue.pop();
  16. return task;
  17. }
  18.  
  19. bool empty(){
  20. std::lock_guard<std::mutex> lock{mutex};
  21. return queue.empty();
  22. }
  23.  
  24. mutable std::mutex mutex;
  25. std::queue<std::function<void()>> queue;
  26. };
  27.  
  28. int main(){
  29. WorkingQueue queue;
  30. std::atomic<bool> stopFlag{false};
  31. auto f = std::async(std::launch::async, [&queue, &stopFlag](){
  32. while(!stopFlag || !queue.empty()){
  33. auto task = queue.popIfNotEmpty();
  34. if(task){
  35. (*task)();
  36. }
  37. }
  38. });
  39. auto sp = std::make_shared<int>(5);
  40. queue.push([sp](){
  41. std::cout << *sp;
  42. });
  43.  
  44. stopFlag = true;
  45. f.get();
  46. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement