如果您在同一文件描述符中的两个不同线程中调用read(或write,或两者兼有)会发生什么情况(让我们说我们对本地文件感兴趣,而这是套接字文件描述符),而没有显式使用同步机制?
read
write
读取和写入是系统调用,因此,在一个单核CPU上,不幸的是两次读取将“同时”执行。但是有多个核心…
linux内核会做什么?
让我们更笼统一点:其他内核(例如BSD)的行为是否总是相同?
编辑:根据密切的文档,我们应该确保文件描述符没有被其他线程中的syscall使用。因此,它暗示在关闭文件描述符之前需要进行显式同步(因此,如果可能调用它的线程仍在运行,那么在读/写周围也是如此)。
在所有主流的类似UNIX的OS中,任何系统级(syscall)文件描述符访问都是线程安全的。尽管取决于年龄,但不一定表示安全。
如果你打电话read,write,accept或从两个不同的任务上的文件描述符相似,那么核心的内部锁定机制将解决争。
accept
对于读取,每个字节可能只能读取一次,并且写入将以任何未定义的顺序进行。
标准输入输出库函数fread,fwrite和合作。默认情况下,也可以在控制结构上具有内部锁定,尽管通过使用标志可以禁用该功能。
fread
fwrite