繁体   English   中英

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

[英]Send Recv on a socket from Multiple threads

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

所以本质上:

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);

}

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

所以事件的顺序:

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

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

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

但是,两个线程期望的消息内容是不同的。 可以交换消息,ThreadA接收ThreadB指定的消息。

发送和接收是否应该涉及某些锁。 (Mutex)

我建议另一种设计,在你有一个单独的线程做其他线程发送和接收,和消息队列。

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

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM