这个问题很简单,我没有通过谷歌搜索发现任何相关内容。对Linux系统进行并发调用是否安全,例如同时在(可能是)多个线程上调用socket()
?具体来说,内核是否保证socket()
,connect()
和/或send()
的线程安全?
如果没有,为什么不呢?我真的想更多地了解这个主题以及为什么系统调用是线程安全的。
我主要担心的是socket()
在从不同的线程调用时不会返回重复或无效的文件描述符。在我的情况下,我不会同时连接或写入同一个套接字。
答案 0 :(得分:4)
对Linux系统进行并发调用是否安全,例如 在同一时间(可能是)的几个线程上调用socket()?
是的,它们是线程安全的。虽然我不确定它是否符合POSIX标准。
具体来说,内核是否保证socket()的线程安全, connect()和/或send()?
根据THIS链接,是的。它表示内部使用了锁,这意味着您的send
操作将被序列化,但不会按任何特定顺序。
回答问题的更新部分:
我主要担心的是socket()不会返回a 从不同的方法调用时重复或无效的文件描述符 线程。
不用担心。操作系统将确保套接字的文件描述符不重复。
答案 1 :(得分:0)
“你会使系统崩溃吗?”否。
“你的线程可能会'竞争',否则就会互相”竞争“,这样你就会得到彻底不可预测和不可重复的结果?绝对是的。
内核通常将资源(例如套接字...)视为由所有线程所属的进程所拥有。 并且,如果特定的调用是“阻塞”,它可能会阻止进程。
最后,套接字操作,例如send
,无论如何都不会因使用线程而受益,因为数据包是通过发送和接收的a(相对慢的......)单线,一次一个,毫秒速度。一个简单的select()
轮询循环通常可以正常工作。 “复杂性不会被重新支付。”