C 普雷德;线程安全与否?

C 普雷德;线程安全与否?,c,multithreading,posix,C,Multithreading,Posix,在同一文件描述符上同时从2个或更多不同线程使用pread是否有问题?我不是100%确定,但我认为文件描述符结构本身不是线程安全的,因此对其进行两次并发更改会损坏它。您需要某种类型的锁定。由于我们使用的是同一个fd,我们必须绑定一个锁,否则将在文件描述符上混合使用来自两个pread的数据。 因此,这样做是有问题的 pread本身是线程安全的,因为它不在主机上。所以说它是安全的 真正的问题是:如果同时读取同一个文件(不一定是从两个线程读取,也可能是从两个进程读取),会发生什么情况 对此,政府表示:

在同一文件描述符上同时从2个或更多不同线程使用pread是否有问题?

我不是100%确定,但我认为文件描述符结构本身不是线程安全的,因此对其进行两次并发更改会损坏它。您需要某种类型的锁定。

由于我们使用的是同一个fd,我们必须绑定一个锁,否则将在文件描述符上混合使用来自两个pread的数据。 因此,这样做是有问题的


pread本身是线程安全的,因为它不在主机上。所以说它是安全的

真正的问题是:如果同时读取同一个文件(不一定是从两个线程读取,也可能是从两个进程读取),会发生什么情况

对此,政府表示:

  • 未指定同一管道、FIFO或终端设备上多个并发读取的行为

    请注意,它没有提到普通文件。该位仅与
    读取
    相关,因为
    pread
    不能用于不可查看的文件

  • I/O对于普通文件、管道和FIFO来说是原子的

    但这是非规范部分的内容,因此您的操作系统可能会有不同的做法。例如,若您从两个线程进行读取,并且存在并发写入,那个么您可能会在两个读取缓冲区中获得不同的写入片段。但是这种问题并不是多线程特有的

也很高兴知道在某些情况下

read()将阻止调用线程

不是进程,只是线程。及

阻塞的线程不应阻止任何未阻塞的线程[…]最终前进


在应用程序端没有要损坏的结构,文件描述符只是一个数字,它实际上是具有数据结构的表中的索引。谁换桌子?C运行时还是内核?如果C运行时更新当前文件偏移量,则不安全。如果是内核,那么它可能是线程安全的。文件描述符表在内核中,而C运行时无权访问它。当然,内核代码必须是线程安全的。这个答案是错误的。
pread
的全部目的是指定要从中读取的位置,其他线程/进程导致的位置更改不会影响读取。请注意,这仅适用于普通文件,也可能适用于其他可查找的设备,而不是管道/ttys/sockets/等。