让读者知道作者已经完成写作,并等待读者完成阅读

问题描述 投票:0回答:1

我有以下读写器场景:

  1. 作家解雇了读者。
  2. 读取器无限旋转,并在写入共享缓冲区后开始从共享缓冲区读取。
  3. 作者开始写入共享缓冲区
  4. 作者等待读者完成阅读。
  5. 程序结束。

伪代码-请假定所有内容都是线程安全的:

// 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]);
           }
        }
    }
}

我的问题:如何使读者摆脱无限循环?

我知道这是一个经典的问题,但是找不到处理它的资源。我所见过的所有内容都与不同类型的锁打交道,这不是我感兴趣的(如前所述-请假设所有内容都是线程安全的)。

multithreading language-agnostic reader writer
1个回答
0
投票

使用共享标志,finished

[作者完成内容写入后,将设置标志finished = true

而不是让读取器永远与while (true)循环,而是在设置标志while (!finished)时终止。

© www.soinside.com 2019 - 2024. All rights reserved.