首页 文章

C socket API是线程安全的吗? [重复]

提问于
浏览
14

这个问题在这里已有答案:

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

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

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

4 回答

  • 10

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

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

  • 0

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

    通常会忽略多个调用,但是在其他线程打开另一个文件描述符的情况下,通常它会获得先前的文件描述符,并且恶梦就会开始 .

  • 2

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

  • 0

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

    sem_t* sem_data;
    

相关问题