Linux 中的并发系统调用
Concurrent system calls in Linux
这个问题很简单,但我还没有通过谷歌搜索找到任何关于它的信息。对 Linux 系统进行并发调用是否安全,例如同时在多个线程上调用socket()
?具体来说,内核是否保证socket()
、connect()
和/或send()
的线程安全?
如果没有,为什么不呢?我真的很想了解有关此主题的更多信息,以及为什么系统调用是线程安全的或不是线程安全的。
我在这里主要关心的是,当从不同的线程调用时,socket()
不会返回重复或无效的文件描述符。在我的情况下,我不会同时连接或写入同一个套接字。
对 Linux 系统进行并发调用是否安全,例如 同时在多个线程上调用 socket()(可能是什么)?
是的,它们是线程安全的。虽然我不确定它是否符合 POSIX 标准。
具体来说,内核是否保证套接字()的线程安全, connect(),和/或send()?
根据此链接,是的。它说锁在内部使用,这意味着您的send
操作将被序列化,但不以任何特定顺序。
对问题的更新部分的回答:
我在这里主要关心的是socket()不会返回一个 从不同调用时的文件描述符重复或无效 线程。
不用担心。OS 将确保套接字的文件描述符不重复。
"你会让系统崩溃吗?" 不会。
"你的线程是否会相互'竞争',从而得到完全不可预测和不可重复的结果? 绝对是的。
内核通常将资源(例如套接字...)视为由所有线程所属的进程拥有。 而且,如果特定调用正在"阻塞",则可能会阻止该进程。
最后,套接字操作,例如 send
,无论如何都不会从线程的使用中受益,因为数据包是通过(相对较慢的......)单线发送和接收的,一次一根,以毫秒级的速度。一个简单的select()
轮询循环通常工作得很好。"复杂性不会得到回报。"
- 有什么好的方法可以让系统调用代理允许在单元测试中进行模拟
- 如果整个应用程序是虚拟映射的,为什么 new 会进行系统调用?
- 如何将C++系统调用连接到 freertos
- 如何使用 C/C++ 和 system() 系统调用以外的其他方法在 Linux 中获取文件功能?
- 系统调用:一次和多次,哪个更好?
- 使用路径和空格的系统调用
- 是否有等效于 macOS 上的 clone() 系统调用?
- 从C++调用系统调用节点?
- C++测试程序中的非法系统调用(对角矩阵元素程序的总和)
- 英特尔 Pin:如何获取系统调用的返回地址
- 如何使用低级系统调用从 stdin 和输入文件中获取字节数
- 使用模拟器C++从RISC-V裸机程序调用printf系统调用时失败
- 动态执行的 ARM ASM 系统调用,可从C++重新定位
- 如何知道我正在使用的Linux OS是否具有特定的系统调用
- 当C 中的系统调用conconculables时,参数字符串中的字符损失
- 调用系统调用函数时出现异常
- 在 boost::asio 中自定义套接字/关闭系统调用
- 系统调用失败"Incorrect Section Name -e" C++
- 绕过系统调用 C++
- Linux 中的并发系统调用