2016-05-31 77 views
0

我有一个过程ProcessA启动2个线程的ThreadAThreadB一个套接字上发送的Recv。这两个线程都使用相同的套接字描述符发送和接收来自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调用recvfrom的()与螺纹A.

然而,通过两个线程预期消息内容是不同的同时进行。 是否可以交换消息,由ThreadA接收ThreadB指定的消息。

发送和接收是否应该参与某些锁定。 (互斥)

回答

1

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

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

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

+0

所以你的意思是这些信息可能被误放。 – Haswell

+1

@Haswell是的,有可能会发生。 –

0

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

  • 一个插座是用于在方向A-> B
  • 在方向B-第二插座>甲

的第二通信可能性是一个套接字与一个作者(线程A)和一个阅读器(线程B)。读者在收到数据报时,可能会根据数据包的有效载荷来决定要完成什么任务。或者它也可以将任务发送给处理数据报的其他工作人员。