从多个线程在套接字上发送 Recv
Send Recv on a socket from Multiple threads
我有一个启动 2 个线程 ThreadA 和 ThreadB 的进程 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()。
但是两个线程期望的消息内容是不同的。
是否可以交换消息,ThreadB 发往的消息被ThreadA 接收。
发送和接收是否会涉及到一些锁。 (互斥量)
我会建议另一种设计,其中您有一个 单个 线程执行发送和接收,以及其他线程的消息队列。
当 send/receive 线程收到一条消息时,它会检查它是哪种消息,并将其添加到正确处理线程的(受保护)队列中。处理线程(您当前的线程 A 和 B)从各自的消息队列中获取消息,并以任何它喜欢的方式处理消息。然后,如果线程 A 或 B 想要发送消息,它会使用另一个队列将其传递给 send/receive 线程,send/receive 线程轮询该队列。
或者,处理线程(您的示例中的 A 和 B)可以直接通过套接字发送。或者每个都有一个不同的套接字仅用于发送。
由于您在两个线程中使用相同的套接字,因此一个线程可能会读取发往另一个线程的消息。即使使用mutex,设计起来也会非常困难。您可以打开两个套接字(甚至管道):
- 一个socket用于A->B方向的通信
- B->A方向的第二个插座
第二种可能性是让一个套接字与一个编写器(线程 A)和一个 reader(线程 B)一起使用。 reader,当它接收到数据报时,它可能根据数据报有效负载来决定要执行什么任务。或者它也可以将任务发送给将处理数据报的其他工作组。
我有一个启动 2 个线程 ThreadA 和 ThreadB 的进程 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()。
但是两个线程期望的消息内容是不同的。 是否可以交换消息,ThreadB 发往的消息被ThreadA 接收。
发送和接收是否会涉及到一些锁。 (互斥量)
我会建议另一种设计,其中您有一个 单个 线程执行发送和接收,以及其他线程的消息队列。
当 send/receive 线程收到一条消息时,它会检查它是哪种消息,并将其添加到正确处理线程的(受保护)队列中。处理线程(您当前的线程 A 和 B)从各自的消息队列中获取消息,并以任何它喜欢的方式处理消息。然后,如果线程 A 或 B 想要发送消息,它会使用另一个队列将其传递给 send/receive 线程,send/receive 线程轮询该队列。
或者,处理线程(您的示例中的 A 和 B)可以直接通过套接字发送。或者每个都有一个不同的套接字仅用于发送。
由于您在两个线程中使用相同的套接字,因此一个线程可能会读取发往另一个线程的消息。即使使用mutex,设计起来也会非常困难。您可以打开两个套接字(甚至管道):
- 一个socket用于A->B方向的通信
- B->A方向的第二个插座
第二种可能性是让一个套接字与一个编写器(线程 A)和一个 reader(线程 B)一起使用。 reader,当它接收到数据报时,它可能根据数据报有效负载来决定要执行什么任务。或者它也可以将任务发送给将处理数据报的其他工作组。