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

时间:2012-06-30 11:29:20

标签: c++ multithreading sockets gcc redhat

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

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

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

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

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

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

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

3 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:0)

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

答案 2 :(得分:0)

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

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