fork(1) download
  1. #include <thread>
  2. #include <condition_variable>
  3. #include <memory>
  4. #include <iostream>
  5. #include <list>
  6. #include <atomic>
  7. std::condition_variable cv;
  8. std::mutex m;
  9. std::thread t;
  10. std::atomic<bool> shouldExit;
  11. std::list<int> jobs;
  12.  
  13. void thread_func()
  14. {
  15. std::unique_lock<std::mutex> lock(m);
  16. while (!shouldExit) {
  17. while (jobs.empty() && !shouldExit) {
  18. cv.wait(lock);
  19. }
  20. // Do some stuff
  21. if (jobs.empty()) {
  22. continue;
  23. }
  24. // Get a job and do something with it
  25. if (!lock.owns_lock()) {
  26. lock.lock();
  27. }
  28. auto j = std::move(jobs.front());
  29. jobs.pop_front();
  30. lock.unlock();
  31. std::cout << "Do something with job " << j << std::endl;
  32. std::this_thread::sleep_for(std::chrono::milliseconds(1));
  33. }
  34. }
  35.  
  36. int main()
  37. {
  38. shouldExit.store(false);
  39. t = std::thread(thread_func);
  40.  
  41. for (int i = 1; i < 100; ++i) {
  42. std::cout << "Push to job " << i << std::endl;
  43. {
  44. std::lock_guard<std::mutex> lock(m);
  45. jobs.push_back(i);
  46. cv.notify_one();
  47. }
  48. std::this_thread::sleep_for(std::chrono::milliseconds(1));
  49. }
  50.  
  51. // To wait for thread exit
  52. shouldExit.store(true);
  53. cv.notify_one();
  54. t.join();
  55. return 0;
  56. }
Time limit exceeded #stdin #stdout 5s 11656KB
stdin
Standard input is empty
stdout
Push to job 1
Do something with job 1
Push to job 2
Do something with job 2
Push to job 3
Do something with job 3
Push to job 4
Do something with job 4
Push to job 5
Do something with job 5
Push to job 6
Do something with job 6
Push to job 7
Do something with job 7
Push to job 8
Do something with job 8
Push to job 9
Do something with job 9
Push to job 10
Do something with job 10
Push to job 11
Do something with job 11
Push to job 12
Do something with job 12
Push to job 13
Do something with job 13
Push to job 14
Do something with job 14
Push to job 15
Do something with job 15
Push to job 16
Do something with job 16
Push to job 17
Do something with job 17
Push to job 18
Do something with job 18
Push to job 19
Do something with job 19
Push to job 20
Do something with job 20
Push to job 21
Do something with job 21
Push to job 22
Do something with job 22
Push to job 23
Do something with job 23
Push to job 24
Do something with job 24
Push to job 25
Do something with job 25
Push to job 26
Do something with job 26
Push to job 27
Do something with job 27
Push to job 28
Do something with job 28
Push to job 29
Do something with job 29
Push to job 30
Do something with job 30
Push to job 31
Do something with job 31
Push to job 32
Do something with job 32
Push to job 33
Do something with job 33
Push to job 34
Do something with job 34
Push to job 35
Do something with job 35
Push to job 36
Do something with job 36
Push to job 37
Do something with job 37
Push to job 38
Do something with job 38
Push to job 39
Do something with job 39
Push to job 40
Do something with job 40
Push to job 41
Do something with job 41
Push to job 42
Push to job 43