多线程发件人

时间:2018-07-17 03:50:53

标签: c multithreading sockets

我正在将流量(例如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));

     }

2 个答案:

答案 0 :(得分:0)

您似乎对互斥体的工作方式尚不清楚。互斥锁不应用于一段代码,而是应用于代码中的一条数据。这里,两个线程都调用了该函数,但是线程之间没有共享数据。因此,正如@Sami Kuhmonen在上面的评论中所述,您无需在此处使用互斥体。

例如,如果将来有第三个线程将数据推送到(例如)队列中,然后您的线程将从该队列中访问该线程并将其发送到连接的计算机,则可能需要使用互斥锁。然后,您需要同步这些线程将数据推入队列和从队列中弹出数据的方式。

答案 1 :(得分:0)

如果您阅读sendmsg的联机帮助页,则可能会看到以下句子:

  

如果消息太长而无法自动通过基础协议,则返回错误EMSGSIZE,并且消息不会发送。

从原子上说,该包始终在一个blob中发送,而其他数据则不能将其自身插入中间。因此,无论有多少个线程使用sendmsg,内核都会混合数据包。