这是一道伪代码面试题。有人告诉我以下方法存在问题。除了在事件等待时保持主线程之外,我找不到其他任何东西。你们能看到任何真正的问题吗?
问题是:
有一个主线程和一个子线程。子线程正在监视一条 30K 消息,该消息以 1K block 的形式从外部源发送。一旦子线程看到 1K block 准备就绪,它就会向主线程函数发出信号以检索数据。伪代码为:
// This method is called in main thread
void MainThreadFunction(out message)
{
var buffer;
loop
{
event.Wait;
read data to buffer;
event.Release;
if (all the data of the message complete)
{
exit loop;
}
}
copy buffer to message;
}
// This method is in child thread
void ChildThreadFunction()
{
// once the 1K chunk of data is ready
event.Set;
}
最佳答案
子线程不会等待主线程读取数据,因此可以在读取旧数据之前开始用新数据覆盖它。
通常在这种情况下,您会维护 2 个或更多子线程可以写入的缓冲区。当主线程正在读取一个时,子线程正在写入下一个。当所有缓冲区都已满时,子线程必须等待主线程完成一个缓冲区。
关于java - 线程之间的信号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34913804/