C socket API是线程安全的吗?

时间:2010-03-01 07:43:50

标签: c++ c multithreading networking sockets

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

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

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

4 个答案:

答案 0 :(得分:10)

套接字不是C ++ Standard的一部分,因此它取决于实现。通常它们不是线程安全的,因为send不是原子操作。请查看this discussion以获取更多信息。

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

答案 1 :(得分:2)

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

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

答案 2 :(得分:0)

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

答案 3 :(得分:0)

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

sem_t* sem_data;