让reader知道作者写完了,等reader读完
Let reader know that writer finished writing, and wait for reader to finish reading
我有以下 reader-writer 场景:
- 一位作家触发了 reader。
- reader 无限旋转,并在写入共享缓冲区后开始读取。
- 写入器开始写入共享缓冲区
- 作者正在等待 reader 阅读完毕。
- 节目结束。
伪代码 - 请假设一切都是线程安全的:
// shared buffer
var buffer = new [3];
// 1. fire a thread, pass it a function named read
thread reader = new thread(read);
// 2. write some text to a shared buffer
var source = new [] {"line 1", "line 2", "line 3"};
for (int i = 0; ++i; i< source.length) {
buffer[i] = source[i];
}
// 3. wait for reader to finish consuming the buffer
reader.join();
// 4. reader function
function void read() {
while (true) {
while (!buffer.empty()) {
for (int i = 0; ++i; i< buffer.length) {
print(buffer[i]);
}
}
}
}
我的问题:如何让 reader 跳出无限循环?
我知道这是一个经典问题,但找不到处理它的资源。我所看到的都是处理不同类型的锁,这不是我感兴趣的东西(如前所述 - 请假设一切都是线程安全的)。
使用共享标志,finished
。
当写入器完成写入其内容时,它会设置标志,finished = true
。
不是让 reader 永远循环 while (true)
,而是在设置标志时终止,while (!finished)
。
我有以下 reader-writer 场景:
- 一位作家触发了 reader。
- reader 无限旋转,并在写入共享缓冲区后开始读取。
- 写入器开始写入共享缓冲区
- 作者正在等待 reader 阅读完毕。
- 节目结束。
伪代码 - 请假设一切都是线程安全的:
// shared buffer
var buffer = new [3];
// 1. fire a thread, pass it a function named read
thread reader = new thread(read);
// 2. write some text to a shared buffer
var source = new [] {"line 1", "line 2", "line 3"};
for (int i = 0; ++i; i< source.length) {
buffer[i] = source[i];
}
// 3. wait for reader to finish consuming the buffer
reader.join();
// 4. reader function
function void read() {
while (true) {
while (!buffer.empty()) {
for (int i = 0; ++i; i< buffer.length) {
print(buffer[i]);
}
}
}
}
我的问题:如何让 reader 跳出无限循环?
我知道这是一个经典问题,但找不到处理它的资源。我所看到的都是处理不同类型的锁,这不是我感兴趣的东西(如前所述 - 请假设一切都是线程安全的)。
使用共享标志,finished
。
当写入器完成写入其内容时,它会设置标志,finished = true
。
不是让 reader 永远循环 while (true)
,而是在设置标志时终止,while (!finished)
。