使用C中的线程的异步文件I / O.

时间:2010-10-13 11:03:33

标签: c multithreading threadpool

我正在尝试了解如何使用线程模拟异步文件操作。我发现了几乎没有什么材料可以阅读这个主题。

是否有可能:

  1. 进程使用线程打开常规文件(HDD)。
  2. 父级从线程获取文件描述符,现在它可以关闭该线程。
  3. 父对象使用带有新线程的文件描述符,从文件中读取X字节。
  4. 父级获取具有当前文件状态的搜索位置的文件描述符。
  5. 父母可以重复这些操作,而不需要每次希望“继续”读取文件的新块时打开或寻找?
  6. 这只是我的一个疯狂的猜测,如果有人想要阐明如何有效地模仿它,那将会很感激。

    更新 通过有效我实际上意味着我不希望线程从文件打开的那一刻起“等待”。想想一个HTTP非阻塞守护进程,它为一个拥有巨大文件的客户端提供服务,你想使用该线程来读取文件的块而不阻塞守护进程 - 但你不想在“等待”时保持线程忙实际转移发生时,您希望将该线程用于其他客户端的其他阻塞操作。

2 个答案:

答案 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。