【发布时间】:2015-02-11 21:30:32
【问题描述】:
从this 之类的帖子中,我知道在 linux 上,recv/send 函数是线程安全的,并且允许用户同时从不同的线程对同一个套接字进行操作。
虽然这不是一个好的设计,但在以下情况下,我想知道我们应该从用户级代码中做什么,以保持数据一致性和健康的运行状态: 有线程在同一个套接字上运行,第一个用于创建和关闭套接字,第二个用于读取套接字,最后一个用于发送套接字。查看伪代码
struct SocketInfo
{
int SockFd;
int SockType;
queue<Packet*> RecvPacks;
};
map<int, SocketInfo*> gSocketInfoMap;
pthread_mutex_t gSocketsLock;
//Thread1
pthread_mutex_lock(&gSocketsLock);
// get information for sock
SocketInfo* info = gSocketInfoMap[sock];
pthread_mutex_unlock(&gSocketsLock);
close(sock); // line-1
.....
//thread-2
pthread_mutex_lock(&gSocketsLock);
SocketInfo* info = gSocketInfoMap[sock];
pthread_mutex_unlock(&gSocketsLock);
recv(sock, buffer, sizeof(buffer)); // line-2
.....
//thread-3
pthread_mutex_lock(&gSocketsLock);
SocketInfo* info = gSocketInfoMap[sock];
pthread_mutex_unlock(&gSocketsLock);
send(sock, buffer, sizeof buffer); // line-3
.....
请问是否需要将Line-1、Line-2、Line-3移入gSocketsLock的保护范围内?为什么?
【问题讨论】:
标签: c++ linux multithreading sockets