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

标签 linux multithreading sockets network-programming pthreads

我有一个启动 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);

}

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

所以事件顺序:

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

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

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

但是两个线程期望的消息内容是不同的。 能否交换消息,ThreadA 收到ThreadB 目的消息。

发送和接收是否应该涉及到一些锁。 (互斥体)

最佳答案

我会建议另一种设计,其中您有一个单个线程执行发送和接收,以及其他线程的消息队列。

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

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

关于linux - 从多个线程在套接字上发送 Recv,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37547215/

相关文章:

c++ - 外部库 : Get cursor image

c++ - 基于事件的 shell 脚本

android - Eclipse 和 Android 模拟器 Windows 与 Linux

java - 使用 JUnit 测试异步代码

flash - 闪光灯无法通过开放式 socket 连接,存在安全问题

linux - 在 Ubuntu 11.10 中显示经典 View

Java processbuilder 在后台运行程序(.exe)

c# - Mutex 与信号量有什么关系?

c++ - 如何在 C++ 套接字程序中检查已连接客户端的可用性

java - Android:从 JAVA 中的 SocketFactory 获取 DatagramSocket