首页 文章

使用多线程在GNU C中使用Write Function是否安全

提问于
浏览
5

将函数调用从多个线程写入同一个套接字

这样安全吗?我们想在它们之间添加同步吗?是否会导致应用程序从网络层到应用程序层的延迟写入/读取等问题

我们在Linux Redhat Enviornment上使用GNU C库GCC 4

这是一个服务器端进程,其中服务器和客户端服务器和客户端之间只有1个套接字连接在2个不同的机器上数据从服务器发送到客户端客户端到服务器

问题1 - 当服务器向客户端发送数据时(多个线程通过相同的单个套接字将数据写入客户端)但是从某些线程写入的数据没有转到客户端,它甚至没有进入网络层机器(Tcpdump没有那个数据)

问题2 - 当客户端发送数据到服务器数据发送客户端时,服务器应用程序没有收到服务器的TCPdump,该服务器应用程序使用循环中的“读取”和“选择”功能从单个线程读取套接字

我们无法确定发生这些问题的模式我们认为当这么多多个线程写入同一个套接字时会发生这种情况我们不同步写入函数希望操作系统处理同步

3 回答

  • 0

    write()是系统调用,而不是库函数,系统调用通常保证是原子的 .

  • 0

    从多个线程使用write()是不安全的 . 无法保证输出不会混洗在一起 . 一次写入可以将其一半的字节放到套接字上,然后另一次写入可以开始将其放入字节 . 如果你需要确保每个写入都是连续写入的(并且很难想象不需要这种保证),那么你需要一个锁或其他同步方法 .

  • 1

    未指定哪个 write 调用首先完成 . 上下文切换可以在第一条指令处停止两次写入中的任何一次 . 这可能导致任意排序 . 没有什么 write 或内核可以做到这一点 . 这是一个根本问题 .

    您的数据将以未指定的顺序写入,这可能是您无法接受的 .

相关问题