Linux中的并发系统调用

时间:2016-07-12 13:48:44

标签: c++ linux multithreading concurrency system-calls

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

如果没有,为什么不呢?我真的想更多地了解这个主题以及为什么系统调用是线程安全的。

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

2 个答案:

答案 0 :(得分:4)

  

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

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

  

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

根据THIS链接,是的。它表示内部使用了锁,这意味着您的send操作将被序列化,但不会按任何特定顺序。

回答问题的更新部分:

  

我主要担心的是socket()不会返回a   从不同的方法调用时重复或无效的文件描述符   线程。

不用担心。操作系统将确保套接字的文件描述符不重复。

答案 1 :(得分:0)

“你会使系统崩溃吗?”否。

“你的线程可能会'竞争',否则就会互相”竞争“,这样你就会得到彻底不可预测和不可重复的结果?绝对是的。

内核通常将资源(例如套接字...)视为由所有线程所属的进程所拥有。 并且,如果特定的调用是“阻塞”,它可能会阻止进程。

最后,套接字操作,例如send,无论如何都不会因使用线程而受益,因为数据包是通过发送和接收的a(相对慢的......)单线,一次一个,毫秒速度。一个简单的select()轮询循环通常可以正常工作。 “复杂性不会被重新支付。”