生产者-消费者模型

一个万能模板

1
2
3
4
5
6
7
8
9
10
11
12
13
14
struct Job{
void (*run)(void *arg);
void *arg;
}
while(1){
struct Job *job;
mutex_lock(&mutex);
while(!(job != get_job())){
wait(&cv, &mutex);
}

mutex_unlock(&mutex);
job->run(job->arg);
}
  • 生产者线程:
    • “生产”产品,并把产品放到一个缓冲区里;
    • 缓冲区充满时阻塞;
    • 缓冲区有数据后唤醒消费者。
  • 消费者线程:
    • “消费”产品;
    • 缓冲区为空时阻塞;
    • 缓冲区未充满时唤醒生产者。

LeetCode 1117. H2O 生成

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
class H2O {
public:
H2O() {
H = 0;
}

int H;
condition_variable cv;
mutex mu;

void hydrogen(function<void()> releaseHydrogen) {
unique_lock<mutex> lock(mu);

while(!(H < 2)){
cv.wait(lock);
}
// releaseHydrogen() outputs "H". Do not change or remove this line.
releaseHydrogen();
H++;
cv.notify_all();
}

void oxygen(function<void()> releaseOxygen) {
unique_lock<mutex> lock(mu);

while(!(H == 2)){
cv.wait(lock);
}
// releaseOxygen() outputs "O". Do not change or remove this line.
releaseOxygen();
H = 0;
cv.notify_all();
}
};