2016-05-31 150 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)。讀者在收到數據報時,可能會根據數據包的有效載荷來決定要完成什麼任務。或者它也可以將任務發送給處理數據報的其他工作人員。