首页 文章

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

提问于
浏览
0

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

基本上:

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要接收的消息 .

所以事件的顺序:

Thread A prepares a message and calls sendto();

Thread B starts executing and prepares a message and calls sendto();

Thread B calls recvfrom() simultaneously with Thread A.

但是,两个线程所期望的消息内容是不同的 . 可以交换消息,ThreadA接收ThreadB目标消息 .

发送和接收是否应该涉及某些锁定 . (互斥)

2 回答

  • 0

    我建议另一个设计,你有一个线程在做发送和接收,以及其他线程的消息队列 .

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

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

  • 1

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

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

    • 方向B-> A的第二个插座

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

相关问题