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

sam*_*ira 5 c++ sockets multithreading gcc redhat

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

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

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

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

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

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

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

Ned*_*der 0

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