// This file is under GNU General Public License 3.0 // see LICENSE.txt #include "pc_container.hh" #include #include #include #include using namespace pEp; // Producer's data: class P { public: P(int i) : data{ new char[64] } { snprintf(data, 63, "%i", i); } P(const P&) = delete; void operator=(const P&) = delete; ~P() { std::cerr << "~P(): data=" << (data ? data : "(NULL)") << '\n'; delete[] data; } char* data; }; // Consumer's data: class C { public: C(int _i) : i(_i) {} int i; }; pc_container pc; void consumer_thread() { bool keep_running = true; int sum = 0; while (keep_running) { for (auto& q : pc) { switch (q.state()) { case PC_State::Created: { const int value = atoi(q.pdata->data); if (value < 0) { std::cerr << "Q\n"; keep_running = false; } else { std::cerr << "C"; q.cdata = new C(value); sum += q.cdata->i; } break; } case PC_State::Deleted: { std::cerr << "D"; sum -= q.cdata->i; delete q.cdata; break; } case PC_State::Changed: { std::cerr << "X"; sum -= q.cdata->i; delete q.cdata; q.cdata = new C(atoi(q.pdata->data)); sum += q.cdata->i; break; } default: throw "Illegal state"; } } } std::cout << "Consumer sum: " << sum << ".\n"; } int main() { for (int i = 0; i < 10; ++i) { pc.insert(new P(i)); } std::thread t{ &consumer_thread }; for (int i = 10; i < 100; ++i) { pc.insert(new P(i)); } while (!pc.empty()) { auto q = pc.begin(); delete q->pdata; pc.erase(q); } pc.insert(new P(-1)); t.join(); }