File tree Expand file tree Collapse file tree 1 file changed +41
-2
lines changed Expand file tree Collapse file tree 1 file changed +41
-2
lines changed Original file line number Diff line number Diff line change @@ -6,6 +6,45 @@ class H2O {
6
6
H2O () {
7
7
}
8
8
9
+ void hydrogen (function<void ()> releaseHydrogen) {
10
+ unique_lock<mutex> l (m_);
11
+ releaseHydrogen_ = releaseHydrogen;
12
+ ++nH_;
13
+ output ();
14
+ }
15
+
16
+ void oxygen (function<void ()> releaseOxygen) {
17
+ unique_lock<mutex> l (m_);
18
+ releaseOxygen_ = releaseOxygen;
19
+ ++nO_;
20
+ output ();
21
+ }
22
+
23
+ private:
24
+ void output () {
25
+ while (nH_ >= 2 && nO_ >= 1 ) {
26
+ nH_ -= 2 ;
27
+ nO_ -= 1 ;
28
+ releaseHydrogen_ ();
29
+ releaseHydrogen_ ();
30
+ releaseOxygen_ ();
31
+ }
32
+ }
33
+
34
+ int nH_ = 0 ;
35
+ int nO_ = 0 ;
36
+ function<void ()> releaseHydrogen_ = nullptr ;
37
+ function<void ()> releaseOxygen_ = nullptr ;
38
+ mutex m_;
39
+ };
40
+
41
+ // Time: O(n)
42
+ // Space: O(1)
43
+ class H2O2 {
44
+ public:
45
+ H2O2 () {
46
+ }
47
+
9
48
void hydrogen (function<void ()> releaseHydrogen) {
10
49
{
11
50
unique_lock<mutex> l (m_);
@@ -38,9 +77,9 @@ class H2O {
38
77
// Time: O(n)
39
78
// Space: O(1)
40
79
// this is much like single thread execution
41
- class H2O2 {
80
+ class H2O3 {
42
81
public:
43
- H2O2 (): curr_(2 ) {
82
+ H2O3 (): curr_(2 ) {
44
83
m2_.lock ();
45
84
}
46
85
You can’t perform that action at this time.
0 commit comments