【问题标题】:If threading shares the same file descriptor table, how does each thread read a different part of the file?如果线程共享同一个文件描述符表,每个线程如何读取文件的不同部分?
【发布时间】:2020-04-25 07:42:57
【问题描述】:

我了解线程几乎共享 PCB 中的所有内容(PC 和堆栈除外),包括文件描述符表。文件描述符表条目是指向系统全开文件表的指针,其中每个条目都有 Op.Type、文件偏移量和文件数据。如果一个进程正在打开一个文件并创建多个线程使用系统调用读取从同一个文件(文件描述符)读取,为什么每个线程会读取文件的不同部分? (假设他们访问同一个表中的相同文件描述符,因此访问相同的文件和相同的偏移量?)

【问题讨论】:

  • 你是什么意思“阅读不同的东西”。请显示一些代码和一些示例,以使您的问题更清楚。如果线程使用相同的文件描述符,那么如果任何线程进行读取,它将移动所有线程的文件偏移量。因此,当另一个线程进行读取时,它与第一个线程读取的内容不同,而是从第一个线程停止读取的地方继续。
  • 我的意思是文件的内容。但这个答案正是我想要的。谢谢
  • 注意,每个线程仍然可以单独打开文件并使用不同的文件描述符进行读取。在这种情况下,fds 在同一个表中,但由于线程使用表中的不同条目,它们都可以独立读取。
  • 如果您希望多个线程使用相同的描述符并拥有自己的偏移量,请使用 pread/pwrite 并手动跟踪偏移量。
  • 我想我明白你在这里真正要问的是:“如果来自 FD 的两个不同进程或线程同时 read 引用相同的打开文件描述,是否可以保证所有文件的数据将被一个进程或另一个进程读取,而没有数据被两者跳过或读取?”如果是这样,请编辑您的问题以确认。

标签: linux file pthreads file-descriptor file-management


【解决方案1】:

凯勒姆的回答: 如果线程使用相同的文件描述符,那么如果任何线程进行读取,它将移动所有线程的文件偏移量。因此,当另一个线程进行读取时,它与第一个线程读取的内容不同,而是从第一个线程停止读取的地方继续。

因此它们确实访问了系统范围文件表上的相同条目,但是由于每个线程都会更改所有线程的文件偏移量,因此它们不会读取文件的同一部分。

【讨论】:

    猜你喜欢
    • 2021-09-10
    • 2012-12-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多