我正在尝试了解如何使用线程模拟异步文件操作。我发现了几乎没有什么材料可以阅读这个主题。
是否有可能:
这只是我的一个疯狂的猜测,如果有人想要阐明如何有效地模仿它,那将会很感激。
更新 通过有效我实际上意味着我不希望线程从文件打开的那一刻起“等待”。想想一个HTTP非阻塞守护进程,它为一个拥有巨大文件的客户端提供服务,你想使用该线程来读取文件的块而不阻塞守护进程 - 但你不想在“等待”时保持线程忙实际转移发生时,您希望将该线程用于其他客户端的其他阻塞操作。
答案 0 :(得分:2)
为了更好地理解异步I / O,根据重叠操作进行思考可能会有所帮助。也就是说,待处理操作的数量(已经开始但尚未完成的操作)可以同时超过一个。
解释异步I / O的图表可能如下所示:http://msdn.microsoft.com/en-us/library/aa365683(VS.85).aspx
如果您正在使用底层操作系统提供的异步I / O功能,则可以从多个文件中异步读取而不会生成相同数量的线程。
如果您的基础操作系统不提供异步I / O,或者您决定不使用它,换句话说,您希望仅通过使用阻塞I / O来模拟异步操作(由常规读/写提供操作系统)然后有必要产生与同时I / O操作的数量一样多的线程。这是因为当一个线程正在调用阻塞I / O的函数时,线程无法继续执行,直到操作完成。为了启动另一个阻塞I / O操作,必须从另一个尚未占用的线程发出该操作。
答案 1 :(得分:0)
打开/创建文件时启动一个线程。现在将该线程id / ptr存储为文件句柄。
基本上线程除了坐在循环中等待“事件”之外什么都不做。信号量在这里会很好。当你想要读取然后你将read命令添加到队列(记住堆栈添加的关键部分),返回一个唯一的id,然后你增加信号量。如果线程处于睡眠状态,它现在将被唤醒并从队列中获取第一条消息并进行处理。完成后,从队列中删除命令。
要轮询文件读取是否已完成,您只需检查它是否在命令队列中。如果不存在那么命令就完成了。
此外,如果您还想允许同步读取,那么您可以在发送消息之后等待“事件”以完成触发。然后检查是否唯一的id是队列,如果不是,则返回控制。如果它仍然存在,那么您将返回等待状态,直到处理完相关的唯一ID。