C socket API是线程安全的吗?

min*_*ang 14 c c++ sockets networking multithreading

我正在使用Linux和Win32套接字API.在我的程序中,多个线程共享套接字句柄.特别是,多个线程send使用共享套接字句柄(即,相同的端口)进行调用.在这种情况下,我是否必须锁定线程安全?我无法找到答案.我可以做一个测试,但想听听你的经历.

编辑:我知道通过套接字发送数据根本不是原子操作.当然,我们必须使用互斥锁来保证线程安全.但是,我想知道系统API是否可以拥有自己的内部锁.如果是这样,我们可以省略自己的锁定.

这个问题也适用于fprintf功能.我想知道这样的系统API会有自己的锁.根据我的经验,fprintf从多个线程调用并没有杀死我的程序,尽管文件或stdout上有比赛(即输出不一致或不可预测,但程序没有崩溃),暗示fprintf有一个锁来保护他们的内部数据结构.

Kir*_*sky 10

套接字不是C++标准的一部分,因此它取决于实现.通常它们不是线程安全的,因为send它不是原子操作.有关其他信息,请查看此讨论.

编辑:操作系统可能有或没有内部锁保护内部结构.这取决于实施.所以你不应该指望它.

  • 根据您的链接和此讨论,听起来 POSIX 发送/接收是线程安全的:http://stackoverflow.com/a/1981439/602245 (3认同)

wei*_*mat 0

通过套接字发送数据不是原子事务 - 任何非原子事务都需要锁定/同步。这与平台无关。

  • 但如果他们这样做的话就会使它们成为原子...... (6认同)