我正在将流量(例如UDP / TCP数据包)从一台计算机发送到另一台计算机。我正在编写一个C应用程序,每种流量类型都有1个线程。我希望这两个线程同时发送数据包。
由于每个线程都在调用sendMsg函数,我是否需要使用任何同步原语,例如互斥锁?
sockaddr_in dest;
void * udp(void * arg){
struct * info = arg;
int fd = socket(AF_INET, SOCK_DGRAM, 0);
//set up socket info
while(1){
sendMsg(udpInfo, fd);
}
}
void * tcp(void * arg){
struct * info = arg;
int fd = socket(AF_INET, SOCK_STREAM, 0);
// set up socket info
while(1){
sendMsg(tcpInfo, fd);
}
}
void sendMsg(struct * info, int fd){
sendTo(fd, "hello", strlen("hello") + 1, 0, (struct sockaddr*)&dest, sizeof(dest));
}
答案 0 :(得分:0)
您似乎对互斥体的工作方式尚不清楚。互斥锁不应用于一段代码,而是应用于代码中的一条数据。这里,两个线程都调用了该函数,但是线程之间没有共享数据。因此,正如@Sami Kuhmonen在上面的评论中所述,您无需在此处使用互斥体。
例如,如果将来有第三个线程将数据推送到(例如)队列中,然后您的线程将从该队列中访问该线程并将其发送到连接的计算机,则可能需要使用互斥锁。然后,您需要同步这些线程将数据推入队列和从队列中弹出数据的方式。
答案 1 :(得分:0)
如果您阅读sendmsg的联机帮助页,则可能会看到以下句子:
如果消息太长而无法自动通过基础协议,则返回错误EMSGSIZE,并且消息不会发送。
从原子上说,该包始终在一个blob中发送,而其他数据则不能将其自身插入中间。因此,无论有多少个线程使用sendmsg,内核都会混合数据包。