Linux 中的并发系统调用

Concurrent system calls in Linux

本文关键字:系统调用 并发 Linux      更新时间:2023-10-16

这个问题很简单,但我还没有通过谷歌搜索找到任何关于它的信息。对 Linux 系统进行并发调用是否安全,例如同时在多个线程上调用socket()?具体来说,内核是否保证socket()connect()和/或send()的线程安全?

如果没有,为什么不呢?我真的很想了解有关此主题的更多信息,以及为什么系统调用是线程安全的或不是线程安全的。

我在这里主要关心的是,当从不同的线程调用时,socket()不会返回重复或无效的文件描述符。在我的情况下,我不会同时连接或写入同一个套接字。

对 Linux 系统进行并发调用是否安全,例如 同时在多个线程上调用 socket()(可能是什么)?

是的,它们是线程安全的。虽然我不确定它是否符合 POSIX 标准。

具体来说,内核是否保证套接字()的线程安全, connect(),和/或send()?

根据此链接,是的。它说锁在内部使用,这意味着您的send操作将被序列化,但不以任何特定顺序。

对问题的更新部分的回答:

我在这里主要关心的是socket()不会返回一个 从不同调用时的文件描述符重复或无效 线程。

不用担心。OS 将确保套接字的文件描述符不重复。

"你会让系统崩溃吗?" 不会。

"你的线程是否会相互'竞争',从而得到完全不可预测和不可重复的结果?  绝对是的。

内核通常将资源(例如套接字...)视为由所有线程所属的进程拥有。 而且,如果特定调用正在"阻塞",则可能会阻止该进程。  

最后,套接字操作,例如 send ,无论如何都不会从线程的使用中受益,因为数据包是通过(相对较慢的......)单线发送和接收的,一次一根,以毫秒级的速度。一个简单的select()轮询循环通常工作得很好。"复杂性不会得到回报。"