C socket API是线程安全的吗?

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

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

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

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

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

我发现多个套接字close()文件描述符调用在并发环境中非常危险。

通常会忽略多个调用,但是如果其他线程打开另一个文件描述符,通常它会获得以前的文件描述符,并且会开始噩梦。

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

不,使用accept创建的变量不需要是互斥锁。 线程使用的任何数据至少应该是信号量。

 sem_t* sem_data;