在多线程代码中,如果有多个线程试图同时向tcp套接字发送数据,会发生什么情况?它们的数据会是混合的,还是不同的线程会一个接一个地发送数据?
发布于 2017-05-18 02:41:43
实际上,正如前面的回答所说:“最安全的机制是只有一个线程向套接字提交数据。”
但是如果你想让多个线程调用读/写,你必须自己保证线程的安全性。我已经在下面的send和recv周围写了一个包装器,它可以为你做这件事。
Send()和Recv()是线程安全的,因为它们不会导致崩溃,但不能保证这些数据不会与从其他线程发送的数据“混合”。因为我们很可能不想这样,所以我们必须阻塞,直到所有线程的数据都被确认发送或接收,或者出错。如此长的阻塞调用可能会有问题,因此请确保您是在可以处理长阻塞操作的线程上执行此操作。
对于linux:
#include <sys/types.h>
#include <sys/socket.h>
#include <map>
#include <mutex>
/* blocks until the full amount of bytes requested are read
* thread safe
* throws exception on error */
void recv_bytes(int sock, char* buf, int len, int flags){
static std::map<int, std::mutex> mtx;
std::lock_guard<std::mutex> lock(mtx[sock]);
int bytes_received = 0;
while (bytes_received != len){
int bytes = recv(sock, buf + bytes_received, len - bytes_received, flags);
//error check
if (bytes == -1){
throw std::runtime_error("Network Exception");
}
bytes_received += bytes;
}
}
/* blocks until the full amount of bytes requested are sent
* thread safe
* throws exception on error */
void send_bytes(int sock, char* buf, int len, int flags){
static std::map<int, std::mutex> mtx;
std::lock_guard<std::mutex> lock(mtx[sock]);
int bytes_sent = 0;
while (bytes_sent != len){
int bytes_s0 = send(sock, buf, len, flags);
if (bytes_sent == -1) {
throw std::runtime_error("Network Exception");
}
bytes_sent += bytes_s0;
}
}
https://stackoverflow.com/questions/7942595
复制相似问题