Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/162.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 1多线程的文件描述符,显示losf上的多个打开文件_C++_Linux_File_File Descriptor - Fatal编程技术网

C++ 1多线程的文件描述符,显示losf上的多个打开文件

C++ 1多线程的文件描述符,显示losf上的多个打开文件,c++,linux,file,file-descriptor,C++,Linux,File,File Descriptor,我有一个一次活动约200个线程的程序。当我打开fd时,我知道它在线程之间共享 在/proc/[pid]/fd中,我实际上只能看到1个fd,但是当查看所有打开的文件时,使用lsof可以看到每个线程都打开了文件。e、 g.同一文件显示200次,pid相同,tid不同 原因是什么 此外,我需要有不同的线程写入同一个文件的不同位置。使用此1 fd是否线程安全?对我来说没有意义,但是如果文件已经在每个线程中打开一次,如lsof所示,那么它可能是安全的。lsof列出了每个线程的文件,因为Linux线程由于底

我有一个一次活动约200个线程的程序。当我打开fd时,我知道它在线程之间共享

在/proc/[pid]/fd中,我实际上只能看到1个fd,但是当查看所有打开的文件时,使用lsof可以看到每个线程都打开了文件。e、 g.同一文件显示200次,pid相同,tid不同

原因是什么

此外,我需要有不同的线程写入同一个文件的不同位置。使用此1 fd是否线程安全?对我来说没有意义,但是如果文件已经在每个线程中打开一次,如lsof所示,那么它可能是安全的。

lsof列出了每个线程的文件,因为Linux线程由于底层操作系统设计而不是真正的线程

Linux上的第一个线程是:

在Linux操作系统中,LinuxThreads是一个部分线程 POSIX线程的实现。自那时以来,它已被 本机POSIX线程库NPTL。主要开发商 利努克斯是泽维尔·勒罗伊

LinuxThreads有很多问题,主要是由于 实现,它使用克隆系统调用创建新的 进程共享父级的地址空间。例如,线程具有 不同的过程标识符,导致信号处理问题; LinuxThreads将信号SIGUSR1和SIGUSR2用于线程间 协调,意味着这些信号不能被程序使用

为了改善这种情况,开始了两个相互竞争的项目 开发替代品;NGPT下一代POSIX线程和NPTL。 NPTL最终胜出,并且今天与绝大多数Linux一起提供 系统

LinuxThreads被NPTL-取代。但是仍然缺乏实际的、完整的内核级线程:

设计

NPTL使用了与LinuxThreads类似的方法,因为内核已知的主要抽象仍然是一个进程,而且是新的 线程是使用从NPTL调用的克隆系统调用创建的 图书馆

大多数时候,Linux缺少完整内核级线程的事实并不明显

操作系统如何处理并发处理实际上并不重要

但这就是为什么lsof会将文件列为由多个进程打开的。因为它是。只是这些进程共享相同的地址空间,以及许多其他资源

请注意,其中一个共享资源是打开的文件描述符的当前偏移量-如果更改一个线程中的偏移量,则更改进程中所有线程的偏移量

如果需要从多个线程写入通过一个文件描述符打开的文件,则可以使用以原子方式写入文件中的任意位置,而不考虑描述符的当前偏移量:

pwrite函数应等同于write,但以下情况除外: 它写入到给定位置,并且不更改文件偏移量 无论是否设置了O_APPEND。前三个论点 pwrite与write相同,只是增加了第四个字符 文件中所需位置的参数偏移量。企图 在无法查找的文件上执行pwrite应 导致错误

请注意,在Linux上,如果使用O_APPEND打开文件,则:

虫子

POSIX要求打开带有O_APPEND标志的文件时 对pwrite写入数据的位置没有影响。 但是,在Linux上,如果文件是用O_APPEND打开的,则pwrite 将数据追加到文件末尾,而不考虑 抵消


大多数情况下与您的问题无关,但除非您拥有的大多数线程大部分时间处于空闲状态,或者您的工作站的CPU核数超过32个左右,否则拥有大约200个线程可能会造成过度杀伤力,并可能会对性能产生负面影响。如果线程写入同一个文件,那么线程之间的同步肯定会成为一个主要的性能抑制因素。并非所有200个线程都在写入该文件,一次只写入3个线程。是的,同步是一个巨大的挑战,但它是一个可扩展的系统,硬件可以支持它。这样问题就小得多了。虽然写操作本身是原子的,但是线程之间的顺序不能保证。我真的建议您尝试重新设计或重构,以便不超过一个线程写入一个文件。哦,谢谢,错过了偏移量设置是原子写入的部分,我想这解决了问题。@OrDinari您可以使用pwrite直接写入任何文件偏移量,而无需查找,因此,您不需要在每个lseek/write对周围使用锁定方案——因为如果您使用lseek然后写入,您必须锁定它。请参阅并注意,如果以追加模式打开文件,Linux上的pwrite将被破坏。
#include <unistd.h>

ssize_t pwrite(int fildes, const void *buf, size_t nbyte,
       off_t offset);