fork download
  1. #include <functional>
  2. #include <iostream>
  3. #include <thread>
  4. #include <mutex>
  5. #include <atomic>
  6.  
  7. using namespace std::chrono_literals;
  8.  
  9. using TypeCallbackRun = std::function<void (int)>;
  10. using TypeCallbackBreak = std::function<bool (int)>;
  11. using TypeCallbackFinish = std::function<void ()>;
  12.  
  13. std::mutex Mutex;
  14.  
  15. // ───────────────────────────────────────────────────────────────────────────────────
  16.  
  17. class Producer {
  18. TypeCallbackRun CallbackRun;
  19. TypeCallbackBreak CallbackBreak;
  20. TypeCallbackFinish CallbackFinish;
  21. public:
  22. void Run() {
  23. Mutex.lock();
  24. std::cout << "Run started (10 times): " << std::this_thread::get_id() << "\n";
  25. Mutex.unlock();
  26. for (int i = 0; i < 1000; ++i) {
  27. if (CallbackBreak && CallbackBreak(i)) break;
  28. if (CallbackRun) CallbackRun(i);
  29. Mutex.lock();
  30. std::cout << ".";
  31. Mutex.unlock();
  32. std::this_thread::sleep_for(10ms);
  33. }
  34. if (CallbackFinish) CallbackFinish();
  35. Mutex.lock();
  36. std::cout << "\nRun finished: " << std::this_thread::get_id() << "\n";
  37. Mutex.unlock();
  38. }
  39. void SetCallbacks(TypeCallbackRun r, TypeCallbackBreak b, TypeCallbackFinish f) {
  40. CallbackRun = r;
  41. CallbackBreak = b;
  42. CallbackFinish = f;
  43. }
  44. };
  45.  
  46. // ───────────────────────────────────────────────────────────────────────────────────
  47.  
  48. class Consumer {
  49. public:
  50. std::atomic<int> Counter;
  51. std::atomic<bool> Ready;
  52. Consumer () {
  53. Counter.store(0);
  54. Ready.store(false);
  55. }
  56. void ProcCallbackRun(const int i) {
  57. std::lock_guard<std::mutex> Lock(Mutex);
  58. std::cout << "(" << i << ") ";
  59. }
  60. bool ProcCallbackBreak([[maybe_unused]] const int i) {
  61. return Counter.load() > 75;
  62. }
  63. void ProcCallbackFinish() {
  64. std::lock_guard<std::mutex> Lock(Mutex);
  65. std::cout << "\nthread finish: " << std::this_thread::get_id() << std::endl;
  66. Ready = true;
  67. }
  68. };
  69.  
  70. // ───────────────────────────────────────────────────────────────────────────────────
  71.  
  72. int main() {
  73. Consumer Cons;
  74. Producer Prod;
  75. Prod.SetCallbacks(
  76. std::bind(&Consumer::ProcCallbackRun, &Cons, std::placeholders::_1),
  77. std::bind(&Consumer::ProcCallbackBreak, &Cons, std::placeholders::_1),
  78. std::bind(&Consumer::ProcCallbackFinish, &Cons)
  79. );
  80. // запуск
  81. std::cout << "main thread: " << std::this_thread::get_id() << std::endl;
  82. std::thread([&]() {
  83. Prod.Run();
  84. }).detach();
  85. while (!Cons.Ready) {
  86. std::this_thread::sleep_for(200ms);
  87. Mutex.lock();
  88. std::cout << "[" << Cons.Counter.load() << "] ";
  89. Cons.Counter++;
  90. Mutex.unlock();
  91. }
  92. std::cout << "exit program: " << std::this_thread::get_id() << std::endl;
  93. return 0;
  94. }
Time limit exceeded #stdin #stdout 5s 4248KB
stdin
Standard input is empty
stdout
main thread: 47616791505408
Run started (10 times): 47616793618176
(0) .(1) .(2) .(3) .(4) .(5) .(6) .(7) .(8) .(9) .(10) .(11) .(12) .(13) .(14) .(15) .(16) .(17) .(18) .(19) .[0] (20) .(21) .(22) .(23) .(24) .(25) .(26) .(27) .(28) .(29) .(30) .(31) .(32) .(33) .(34) .(35) .(36) .(37) .(38) .(39) .[1] (40) .(41) .(42) .(43) .(44) .(45) .(46) .(47) .(48) .(49) .(50) .(51) .(52) .(53) .(54) .(55) .(56) .(57) .(58) .(59) .[2] (60) .(61) .(62) .(63) .(64) .(65) .(66) .(67) .(68) .(69) .(70) .(71) .(72) .(73) .(74) .(75) .(76) .(77) .(78) .(79) .[3] (80) .(81) .(82) .(83) .(84) .(85) .(86) .(87) .(88) .(89) .(90) .(91) .(92) .(93) .(94) .(95) .(96) .(97) .(98) .(99) .[4] (100) .(101) .(102) .(103) .(104) .(105) .(106) .(107) .(108) .(109) .(110) .(111) .(112) .(113) .(114) .(115) .(116) .(117) .(118) .(119) .[5] (120) .(121) .(122) .(123) .(124) .(125) .(126) .(127) .(128) .(129) .(130) .(131) .(132) .(133) .(134) .(135) .(136) .(137) .(138) .(139) .[6] (140) .(141) .(142) .(143) .(144) .(145) .(146) .(147) .(148) .(149) .(150) .(151) .(152) .(153) .(154) .(155) .(156) .(157) .(158) .(159) .[7] (160) .(161) .(162) .(163) .(164) .(165) .(166) .(167) .(168) .(169) .(170) .(171) .(172) .(173) .(174) .(175) .(176) .(177) .(178) .[8] (179) .(180) .(181) .(182) .(183) .(184) .(185) .(186) .(187) .(188) .(189) .(190) .(191) .(192) .(193) .(194) .(195) .(196) .(197) .(198) .[9] (199) .(200) .(201) .(202) .(203) .(204) .(205) .(206) .(207) .(208) .(209) .(210) .(211) .(212) .(213) .(214) .(215) .(216) .(217) .(218) .[10] (219) .(220) .(221) .(222) .(223) .(224) .(225) .(226) .(227) .(228) .(229) .(230) .(231) .(232) .(233) .(234) .(235) .(236) .(237) .(238) .[11] (239) .(240) .(241) .(242) .(243) .(244) .(245) .(246) .(247) .(248) .(249) .(250) .(251) .(252) .(253) .(254) .(255) .(256) .(257) .(258) .[12] (259) .(260) .(261) .(262) .(263) .(264) .(265) .(266) .(267) .(268) .(269) .(270) .(271) .(272) .(273) .(274) .(275) .(276) .(277) .(278) .[13] (279) .(280) .(281) .(282) .(283) .(284) .(285) .(286) .(287) .(288) .(289) .(290) .(291) .(292) .(293) .(294) .(295) .(296) .(297) .(298) .[14] (299) .(300) .(301) .(302) .(303) .(304) .(305) .(306) .(307) .(308) .(309) .(310) .(311) .(312) .(313) .(314) .(315) .(316) .(317) .(318) .[15] (319) .(320) .(321) .(322) .(323) .(324) .(325) .(326) .(327) .(328) .(329) .(330) .(331) .(332) .(333) .(334) .(335) .(336) .(337) .(338) .[16] (339) .(340) .(341) .(342) .(343) .(344) .(345) .(346) .(347) .(348) .(349) .(350) .(351) .(352) .(353) .(354) .(355) .(356) .(357) .[17] (358) .(359) .(360) .(361) .(362) .(363) .(364) .(365) .(366) .(367) .(368) .(369) .(370) .(371) .(372) .(373) .(374) .(375) .(376) .(377) .[18] (378) .(379) .(380) .(381) .(382) .(383) .(384) .(385) .(386) .(387) .(388) .(389) .(390) .(391) .(392) .(393) .(394) .(395) .(396) .(397) .[19] (398) .(399) .(400) .(401) .(402) .(403) .(404) .(405) .(406) .(407) .(408) .(409) .(410) .(411) .(412) .(413) .(414) .(415) .(416) .(417) .[20] (418) .(419) .(420) .(421) .(422) .(423) .(424) .(425) .(426) .(427) .(428) .(429) .(430) .(431) .(432) .(433) .(434) .(435) .(436) .(437) .[21] (438) .(439) .(440) .(441) .(442) .(443) .(444) .(445) .(446) .(447) .(448) .(449) .(450) .(451) .(452) .(453) .(454) .(455) .(456) .(457) .[22] (458) .(459) .(460) .(461) .(462) .(463) .(464) .(465) .(466) .(467) .(468) .(469) .(470) .(471) .(472) .(473) .(474) .(475) .(476) .(477) .[23] (478) .(479) .(480) .(481) .(482) .(483) .(484) .(485) .(486) .(487) .(488) .(489) .(490) .(491) .(492) .(493) .(494) .(495) .(496) .(497) .[24] (498) .(499) .(500) .(501) .(502) .(503) .(504) .(505) .(506) .(507) .(508) .(509) .(510) .(511) .(512) .(513) .(514) .(515) .(516) .(517) .[25] (518) .(519) .(520) .(521) .(522) .(523) .(524) .(525) .(526) .(527) .(528) .(529) .(530) .(531) .(532) .(533) .(534) .(535) .(536) .[26] (537) .(538) .(539) .(540) .(541) .(542) .(543) .(544) .(545) .(546) .(547) .(548) .(549) .(550) .(551) .(552) .(553) .(554) .(555) .(556) .[27] (557) .(558) .(559) .(560) .(561) .(562) .(563) .(564) .(565) .(566) .(567) .(568) .(569) .(570) .(571) .(572) .(573) .(574) .(575) .(576)