C 读和线程安全 (linux)

标签 c linux multithreading file-descriptor

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

Read 和 Write 是系统调用,因此,在单核 CPU 上,“同时”执行两个读取可能很不幸。但是多核...

linux 内核会做什么?

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

编辑:根据close documentation ,我们应该确保文件描述符没有被其他线程中的系统调用使用。因此,在关闭文件描述符之前需要显式同步(因此,如果可能调用它的线程仍在运行,则也围绕读/写)。

最佳答案

任何系统级(系统调用)文件描述符访问在所有主流类 UNIX 操作系统中都是线程安全的。 尽管根据年龄的不同,它们不一定是安全信号。

如果您从两个不同的任务中调用readwriteaccept 或类似的文件描述符,那么内核的内部锁定机制将解析争论。

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

stdio 库函数 freadfwrite 和 co。默认情况下,控制结构也有内部锁定,但通过使用标志可以禁用它。

关于C 读和线程安全 (linux),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35059660/

相关文章:

c - 如果 free() 知道我的数组的长度,为什么我不能在我自己的代码中请求它?

c# - 多线程 .NET 应用程序导致在 64 位四核 Windows Server 上运行的 KERNEL32.dll 中出现应用程序错误

Android NDK 如何将收到的 DatagramPacket 作为参数传递给 C 函数?

c - 在 K&R 2-1 中解释这段代码

linux - 可以将 10 个相似的函数变成一个 for 循环吗?

c - ARP 的编程使用

c# - 从死锁更新

c# - 我可以回到线程执行上下文吗?

C最大数计数

java - 如何在 Linux 上查看/更改套接字连接超时?