从多个线程在套接字上发送 Recv



我有一个进程 ProcessA 启动 2 个线程 A线程 B。两个线程都使用相同的套接字描述符从进程 B 发送和接收数据。

所以本质上:

int s;
void thread_fnA(void*)
{
    while(1) {
        sendto(s);
        recvfrom(s);
    }
}
void thread_fnB(void*)
{
    while(1) {
        sendto(s);
        recvfrom(s);
    }
}
int main()
{
      s = socket(AF_UNIX, SOCK_DGRAM, 0);
      bind(s);
      dispatch_thread(A);
      dispatch_thread(B);
}

线程 B 接收的消息是否有可能在线程 A 中接收。

所以事件的顺序:

线程 A 准备一条消息并调用 sendto();

线程 B 开始执行并准备一条消息并调用 sendto();

线程 B 与线程 A 同时调用 recvfrom()。

但是,两个线程预期的消息内容是不同的。消息可以交换吗,线程 B 发往的消息由线程 A 接收。

发送和接收是否涉及某些锁。(互斥)

我建议另一种设计,其中您有一个线程进行发送和接收,并为其他线程发送消息队列。

当发送/接收线程收到消息时,它会检查它是哪种消息,并将其投放到正确处理线程的(受保护)队列中。处理线程(您当前的踏板 A 和 B)从其各自的消息队列中获取消息,并以它喜欢的任何方式处理消息。然后,如果线程 A 或 B 想要发送消息,它会使用另一个队列将其传递给发送/接收线程,发送/接收线程轮询该队列。

或者,处理线程(示例中的 A 和 B)可以直接通过套接字发送。或者每个都有仅用于发送的不同套接字。

由于您在两个线程中使用相同的套接字,因此一个线程可能会读取发往另一个线程的消息。即使使用互斥锁,设计也会非常困难。您可以打开两个插座(甚至管道):

  • 一个插座用于 A->B 方向的通信
  • B->A方向的第二个插座

第二种可能性是有一个带有一个写入器(线程 A)和一个读取器(线程 B)的套接字。读取器在收到数据报时,可能会根据数据报有效负载来决定要执行什么任务。或者,它还可以将任务发送给将处理数据报的其他工作线程集。

最新更新