51 lines
1.0 KiB
C++
51 lines
1.0 KiB
C++
#include "pip.h"
|
|
|
|
class PIThreadNotifier {
|
|
public:
|
|
PIThreadNotifier(): cnt(0) {}
|
|
|
|
void wait() {
|
|
m.lock();
|
|
while (cnt == 0) v.wait(m);
|
|
cnt--;
|
|
m.unlock();
|
|
}
|
|
void notifyOnce() {
|
|
m.lock();
|
|
cnt++;
|
|
v.notifyAll();
|
|
m.unlock();
|
|
}
|
|
private:
|
|
ullong cnt;
|
|
PIMutex m;
|
|
PIConditionVariable v;
|
|
};
|
|
|
|
|
|
int main(int argc, char * argv[]) {
|
|
PIThreadNotifier n;
|
|
int cnt1 = 0;
|
|
int cnt2 = 0;
|
|
int cnt3 = 0;
|
|
PIThread t1([&n, &cnt1](){n.wait(); cnt1++; piMSleep(1);}, true);
|
|
PIThread t2([&n, &cnt2](){n.wait(); cnt2++; piMSleep(2);}, true);
|
|
piCout << "created";
|
|
piMSleep(10);
|
|
piCout << "unlock" << cnt1 << cnt2 << cnt3;
|
|
n.notifyOnce(); cnt3++;
|
|
piMSleep(10);
|
|
piCout << "unlock" << cnt1 << cnt2 << cnt3;
|
|
n.notifyOnce(); cnt3++;
|
|
piMSleep(10);
|
|
piCout << "run" << cnt1 << cnt2 << cnt3;
|
|
PIThread t3([&n, &cnt3](){n.notifyOnce(); cnt3++; piMSleep(1);}, true);
|
|
piMSleep(20);
|
|
t3.stop();
|
|
piMSleep(100);
|
|
piCout << "exit" << cnt1 << cnt2 << cnt3;
|
|
// m.unlock();
|
|
// piMSleep(10);
|
|
return 0;
|
|
}
|