一尘不染

C读取和线程安全性(Linux)

linux

如果您在同一文件描述符中的两个不同线程中调用read(或write,或两者兼有)会发生什么情况(让我们说我们对本地文件感兴趣,而这是套接字文件描述符),而没有显式使用同步机制?

读取和写入是系统调用,因此,在一个单核CPU上,不幸的是两次读取将“同时”执行。但是有多个核心…

linux内核会做什么?

让我们更笼统一点:其他内核(例如BSD)的行为是否总是相同?

编辑:根据密切的文档,我们应该确保文件描述符没有被其他线程中的syscall使用。因此,它暗示在关闭文件描述符之前需要进行显式同步(因此,如果可能调用它的线程仍在运行,那么在读/写周围也是如此)。


阅读 393

收藏
2020-06-03

共1个答案

一尘不染

在所有主流的类似UNIX的OS中,任何系统级(syscall)文件描述符访问都是线程安全的。尽管取决于年龄,但不一定表示安全。

如果你打电话readwriteaccept或从两个不同的任务上的文件描述符相似,那么核心的内部锁定机制将解决争。

对于读取,每个字节可能只能读取一次,并且写入将以任何未定义的顺序进行。

标准输入输出库函数freadfwrite和合作。默认情况下,也可以在控制结构上具有内部锁定,尽管通过使用标志可以禁用该功能。

2020-06-03