5

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

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

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

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

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

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

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

4

3 回答 3

1

write() 是系统调用,不是库函数,系统调用一般保证是原子的。

于 2012-07-03T10:08:16.617 回答
0

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

于 2012-06-30T11:33:06.363 回答
0

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

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

于 2014-01-12T18:05:26.857 回答