File tree 5 files changed +202
-22
lines changed
solution/1100-1199/1117.Building H2O
5 files changed +202
-22
lines changed Original file line number Diff line number Diff line change 66
66
<!-- 这里可写当前语言的特殊实现逻辑 -->
67
67
68
68
``` python
69
-
69
+ from threading import Semaphore
70
+
71
+
72
+ class H2O :
73
+ def __init__ (self ):
74
+ self .h = Semaphore(2 )
75
+ self .o = Semaphore(0 )
76
+
77
+ def hydrogen (self , releaseHydrogen : " Callable[[], None]" ) -> None :
78
+ self .h.acquire()
79
+ # releaseHydrogen() outputs "H". Do not change or remove this line.
80
+ releaseHydrogen()
81
+ if self .h._value == 0 :
82
+ self .o.release()
83
+
84
+ def oxygen (self , releaseOxygen : " Callable[[], None]" ) -> None :
85
+ self .o.acquire()
86
+ # releaseOxygen() outputs "O". Do not change or remove this line.
87
+ releaseOxygen()
88
+ self .h.release(2 )
70
89
```
71
90
72
91
### ** Java**
73
92
74
93
<!-- 这里可写当前语言的特殊实现逻辑 -->
75
94
76
95
``` java
96
+ class H2O {
97
+ private Semaphore h = new Semaphore (2 );
98
+ private Semaphore o = new Semaphore (0 );
99
+
100
+ public H2O () {
101
+
102
+ }
103
+
104
+ public void hydrogen (Runnable releaseHydrogen ) throws InterruptedException {
105
+ h. acquire();
106
+ // releaseHydrogen.run() outputs "H". Do not change or remove this line.
107
+ releaseHydrogen. run();
108
+ o. release();
109
+ }
110
+
111
+ public void oxygen (Runnable releaseOxygen ) throws InterruptedException {
112
+ o. acquire(2 );
113
+ // releaseOxygen.run() outputs "O". Do not change or remove this line.
114
+ releaseOxygen. run();
115
+ h. release(2 );
116
+ }
117
+ }
118
+ ```
77
119
120
+ ### ** C++**
121
+
122
+ ``` cpp
123
+ #include < semaphore.h>
124
+
125
+ class H2O {
126
+ private:
127
+ sem_t h, o;
128
+ int st;
129
+
130
+ public:
131
+ H2O() {
132
+ sem_init(&h, 0, 2);
133
+ sem_init(&o, 0, 0);
134
+ st = 0;
135
+ }
136
+
137
+ void hydrogen(function<void()> releaseHydrogen) {
138
+ sem_wait(&h);
139
+ // releaseHydrogen() outputs "H". Do not change or remove this line.
140
+ releaseHydrogen();
141
+ ++st;
142
+ if (st == 2) {
143
+ sem_post(&o);
144
+ }
145
+ }
146
+
147
+ void oxygen (function<void()> releaseOxygen) {
148
+ sem_wait(&o);
149
+ // releaseOxygen() outputs "O". Do not change or remove this line.
150
+ releaseOxygen();
151
+ st = 0;
152
+ sem_post(&h);
153
+ sem_post(&h);
154
+ }
155
+ };
78
156
```
79
157
80
158
### **...**
Original file line number Diff line number Diff line change 54
54
### ** Python3**
55
55
56
56
``` python
57
-
57
+ from threading import Semaphore
58
+
59
+
60
+ class H2O :
61
+ def __init__ (self ):
62
+ self .h = Semaphore(2 )
63
+ self .o = Semaphore(0 )
64
+
65
+ def hydrogen (self , releaseHydrogen : " Callable[[], None]" ) -> None :
66
+ self .h.acquire()
67
+ # releaseHydrogen() outputs "H". Do not change or remove this line.
68
+ releaseHydrogen()
69
+ if self .h._value == 0 :
70
+ self .o.release()
71
+
72
+ def oxygen (self , releaseOxygen : " Callable[[], None]" ) -> None :
73
+ self .o.acquire()
74
+ # releaseOxygen() outputs "O". Do not change or remove this line.
75
+ releaseOxygen()
76
+ self .h.release(2 )
58
77
```
59
78
60
79
### ** Java**
61
80
62
81
``` java
82
+ class H2O {
83
+ private Semaphore h = new Semaphore (2 );
84
+ private Semaphore o = new Semaphore (0 );
85
+
86
+ public H2O () {
87
+
88
+ }
89
+
90
+ public void hydrogen (Runnable releaseHydrogen ) throws InterruptedException {
91
+ h. acquire();
92
+ // releaseHydrogen.run() outputs "H". Do not change or remove this line.
93
+ releaseHydrogen. run();
94
+ o. release();
95
+ }
96
+
97
+ public void oxygen (Runnable releaseOxygen ) throws InterruptedException {
98
+ o. acquire(2 );
99
+ // releaseOxygen.run() outputs "O". Do not change or remove this line.
100
+ releaseOxygen. run();
101
+ h. release(2 );
102
+ }
103
+ }
104
+ ```
63
105
106
+ ### ** C++**
107
+
108
+ ``` cpp
109
+ #include < semaphore.h>
110
+
111
+ class H2O {
112
+ private:
113
+ sem_t h, o;
114
+ int st;
115
+
116
+ public:
117
+ H2O() {
118
+ sem_init(&h, 0, 2);
119
+ sem_init(&o, 0, 0);
120
+ st = 0;
121
+ }
122
+
123
+ void hydrogen(function<void()> releaseHydrogen) {
124
+ sem_wait(&h);
125
+ // releaseHydrogen() outputs "H". Do not change or remove this line.
126
+ releaseHydrogen();
127
+ ++st;
128
+ if (st == 2) {
129
+ sem_post(&o);
130
+ }
131
+ }
132
+
133
+ void oxygen (function<void()> releaseOxygen) {
134
+ sem_wait(&o);
135
+ // releaseOxygen() outputs "O". Do not change or remove this line.
136
+ releaseOxygen();
137
+ st = 0;
138
+ sem_post(&h);
139
+ sem_post(&h);
140
+ }
141
+ };
64
142
```
65
143
66
144
### **...**
Original file line number Diff line number Diff line change
1
+ #include < semaphore.h>
2
+
1
3
class H2O {
2
4
private:
3
- int n_h ;
4
- mutex m_h, m_o ;
5
+ sem_t h, o ;
6
+ int st ;
5
7
6
8
public:
7
9
H2O () {
8
- m_o.lock ();
9
- n_h = 2 ;
10
+ sem_init (&h, 0 , 2 );
11
+ sem_init (&o, 0 , 0 );
12
+ st = 0 ;
10
13
}
11
14
12
15
void hydrogen (function<void ()> releaseHydrogen) {
13
- m_h.lock ();
16
+ sem_wait (&h);
17
+ // releaseHydrogen() outputs "H". Do not change or remove this line.
14
18
releaseHydrogen ();
15
- n_h--;
16
- if (n_h > 0 )
17
- m_h.unlock ();
18
- else
19
- m_o.unlock ();
19
+ ++st;
20
+ if (st == 2 ) {
21
+ sem_post (&o);
22
+ }
20
23
}
21
24
22
25
void oxygen (function<void ()> releaseOxygen) {
23
- m_o.lock ();
26
+ sem_wait (&o);
27
+ // releaseOxygen() outputs "O". Do not change or remove this line.
24
28
releaseOxygen ();
25
- n_h = 2 ;
26
- m_h.unlock ();
29
+ st = 0 ;
30
+ sem_post (&h);
31
+ sem_post (&h);
27
32
}
28
33
};
Original file line number Diff line number Diff line change 1
1
class H2O {
2
-
3
2
private Semaphore h = new Semaphore (2 );
4
3
private Semaphore o = new Semaphore (0 );
4
+
5
5
public H2O () {
6
+
6
7
}
7
8
8
9
public void hydrogen (Runnable releaseHydrogen ) throws InterruptedException {
9
-
10
+ h . acquire ();
10
11
// releaseHydrogen.run() outputs "H". Do not change or remove this line.
11
- h .acquire ();
12
12
releaseHydrogen .run ();
13
13
o .release ();
14
14
}
15
15
16
16
public void oxygen (Runnable releaseOxygen ) throws InterruptedException {
17
-
18
- // releaseOxygen.run() outputs "O". Do not change or remove this line.
19
17
o .acquire (2 );
20
- releaseOxygen .run ();
18
+ // releaseOxygen.run() outputs "O". Do not change or remove this line.
19
+ releaseOxygen .run ();
21
20
h .release (2 );
22
21
}
23
- }
22
+ }
Original file line number Diff line number Diff line change
1
+ from threading import Semaphore
2
+
3
+
4
+ class H2O :
5
+ def __init__ (self ):
6
+ self .h = Semaphore (2 )
7
+ self .o = Semaphore (0 )
8
+
9
+ def hydrogen (self , releaseHydrogen : "Callable[[], None]" ) -> None :
10
+ self .h .acquire ()
11
+ # releaseHydrogen() outputs "H". Do not change or remove this line.
12
+ releaseHydrogen ()
13
+ if self .h ._value == 0 :
14
+ self .o .release ()
15
+
16
+ def oxygen (self , releaseOxygen : "Callable[[], None]" ) -> None :
17
+ self .o .acquire ()
18
+ # releaseOxygen() outputs "O". Do not change or remove this line.
19
+ releaseOxygen ()
20
+ self .h .release (2 )
You can’t perform that action at this time.
0 commit comments