我有一个 ProcessA 流程,可启动2个主题 ThreadA 和 ThreadB 。两个线程使用相同的套接字描述符从 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要接收的消息。
事件序列:
线程A准备一条消息并调用sendto();
线程B开始执行并准备一条消息并调用sendto();
线程B与线程A同时调用recvfrom()。
然而,两个线程所期望的消息内容是不同的。 可以交换消息,ThreadA将接收到ThreadB目标消息。
发送和接收是否应该涉及某些锁定。 (互斥)
答案 0 :(得分:1)
我建议使用另一种设计,其中有单个线程执行发送和接收,以及其他线程的消息队列。
当发送/接收线程收到消息时,它会检查它是什么类型的消息,并将其添加到正确处理线程的(受保护)队列中。处理线程(您当前的步骤A和B)从其各自的消息队列中获取消息,并以任何方式处理消息。然后,如果线程A或B想要发送消息,它会使用发送/接收线程轮询的另一个队列将其传递给发送/接收线程。
或者,处理线程(在您的示例中为A和B)可以直接通过套接字发送。或者每个都有一个不同的套接字,仅用于发送。
答案 1 :(得分:0)
由于您在两个线程中使用相同的套接字,因此一个线程可能会读取发往另一个线程的消息。即使您使用互斥锁,设计也会非常困难。你可以打开两个插座(甚至是管道):
第二种可能性是使一个插槽具有一个写入器(线程A)和一个读取器(线程B)。读者在收到数据报时,可能会根据数据报有效负载决定要执行的任务。或者,它也可以将任务发送给处理数据报的其他工作人员。