#include <functional> #include <iostream> #include <thread> #include <mutex> #include <atomic> using namespace std::chrono_literals; using TypeCallbackRun = std::function<void (int)>; using TypeCallbackBreak = std::function<bool (int)>; using TypeCallbackFinish = std::function<void ()>; std::mutex Mutex; // ─────────────────────────────────────────────────────────────────────────────────── class Producer { TypeCallbackRun CallbackRun; TypeCallbackBreak CallbackBreak; TypeCallbackFinish CallbackFinish; public: void Run() { Mutex.lock(); std::cout << "Run started (10 times): " << std::this_thread::get_id() << "\n"; Mutex.unlock(); for (int i = 0; i < 1000; ++i) { if (CallbackBreak && CallbackBreak(i)) break; if (CallbackRun) CallbackRun(i); Mutex.lock(); std::cout << "."; Mutex.unlock(); std::this_thread::sleep_for(10ms); } if (CallbackFinish) CallbackFinish(); Mutex.lock(); std::cout << "\nRun finished: " << std::this_thread::get_id() << "\n"; Mutex.unlock(); } void SetCallbacks(TypeCallbackRun r, TypeCallbackBreak b, TypeCallbackFinish f) { CallbackRun = r; CallbackBreak = b; CallbackFinish = f; } }; // ─────────────────────────────────────────────────────────────────────────────────── class Consumer { public: std::atomic<int> Counter; std::atomic<bool> Ready; Consumer () { Counter.store(0); Ready.store(false); } void ProcCallbackRun(const int i) { std::lock_guard<std::mutex> Lock(Mutex); std::cout << "(" << i << ") "; } bool ProcCallbackBreak([[maybe_unused]] const int i) { return Counter.load() > 75; } void ProcCallbackFinish() { std::lock_guard<std::mutex> Lock(Mutex); std::cout << "\nthread finish: " << std::this_thread::get_id() << std::endl; Ready = true; } }; // ─────────────────────────────────────────────────────────────────────────────────── int main() { Consumer Cons; Producer Prod; Prod.SetCallbacks( std::bind(&Consumer::ProcCallbackRun, &Cons, std::placeholders::_1), std::bind(&Consumer::ProcCallbackBreak, &Cons, std::placeholders::_1), std::bind(&Consumer::ProcCallbackFinish, &Cons) ); // запуск std::cout << "main thread: " << std::this_thread::get_id() << std::endl; std::thread([&]() { Prod.Run(); }).detach(); while (!Cons.Ready) { std::this_thread::sleep_for(200ms); Mutex.lock(); std::cout << "[" << Cons.Counter.load() << "] "; Cons.Counter++; Mutex.unlock(); } std::cout << "exit program: " << std::this_thread::get_id() << std::endl; return 0; }
Standard input is empty
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)