【发布时间】:2018-07-18 03:13:09
【问题描述】:
我是 C 新手,想了解多线程如何与套接字一起工作。
我了解如何创建线程,但我不了解它们在这种情况下是如何工作的。
两个线程同时接收数据包。 当第一个线程进入receiveData函数,调用recvmsg()时,第二个线程会不会一直阻塞,直到第一个线程收到数据包并退出receiveData函数?
有没有办法防止额外的线程被阻塞?
void * tcp (void * arg){
struct * info = arg;
// set up socket fd
fd = socket(AF_INET, SOCK_STREAM, 0);
while(True){
receiveData(info, fd);
}
}
void * icmp (void * arg){
struct * info = arg;
// set up socket fd
fd = socket(AF_INET, SOCK_RAW, IPPROTO_ICMP);
while(True){
receiveData(info, fd);
}
}
//function that is called by thread 1 and thread 2 concurrently
void receiveData(struct * info, int fd){
int val = recv(fd, buf, 1000, 0);
}
【问题讨论】:
-
这取决于操作系统、版本、套接字类型和套接字的状态(数据挂起等)。一般来说内核不会让任何“坏”发生,但我很确定结果是不确定的。你应该发一个minimal reproducible example。
-
int val = receiveData(info, fd);无效,因为receiveData()返回 void。
标签: c multithreading sockets