C读取和线程安全(linux)

Jer*_*hoy 11 c linux multithreading file-descriptor

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

读取和写入都是系统调用,因此,在单核CPU上,可能不幸的是两个读取将"同时"执行.但是有多个核心......

linux内核会做什么?

让我们更通用一点:其他内核(如BSD)的行为总是一样的吗?

编辑:根据密切的文档,我们应该确保文件描述符不被其他线程中的系统调用使用.因此,它的接缝显式同步将关闭文件描述符之前,需要进行(等,还围绕读/写,如果线程可以称之为仍在运行).

Ser*_* L. 14

在所有类似UNIX的主流操作系统中,任何系统级(syscall)文件描述符访问都是线程安全的.虽然取决于年龄,但它们不一定是信号安全的.

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

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

标准输入输出库函数fread,fwrite和合作.默认情况下,控制结构上也有内部锁定,但通过使用标志可以禁用它.

  • 如果你能为read/write/accept和fread/fwrite添加一些官方文档的链接,我会很高兴:) (2认同)
  • 请注意,如果您在一个线程中调用write而另一个线程正在修改在write中传递给内核的缓冲区,则写入的实际数据可能包含也可能不包含由另一个线程放在那里的某些修改数据. (2认同)

Chr*_*odd 5

关于 close 的评论是因为在其他线程可能尝试使用文件描述符的任何情况下关闭文件描述符都没有多大意义。因此,虽然就内核而言它是“安全的”,但它可能会导致奇怪的、难以诊断的极端情况。

如果一个线程在另一个线程尝试读取文件描述符时关闭该文件描述符,则第二个线程可能会收到意外的 EBADF 错误。更糟糕的是,如果第三个线程同时打开一个新文件,则可能会重新分配相同的文件描述符,并且第二个线程可能会意外地从新文件而不是它期望的文件中读取......