2014-02-18 94 views
2

我有一個程序有3個線程。它們都從不同端口上的以太網接收數據。線程中3個數據的頻率可能不同。但所有傳入的數據必須同時處理。qt中的線程同步

所以如果一個數據來自一個線程,它必須等待其他數據來。我怎麼才能得到它?

+0

您需要在線程之間進行通信,出現一些等待條件 – 4pie0

回答

5

Boost.Thread有一個barrier類,其目的是阻止多個線程,直到指定的數字到達屏障。

您只需創建一個用3初始化的boost::barrier,這意味着它會阻塞,直到三個線程在屏障上等待。當您的每個線程完成數據等待時,您都需要在屏障上調用wait()。當第三個線程調用wait()時,所有三個線程都將繼續執行。

boost::barrier barrier(3); 

void thread_function() 
{ 
    read_data(); 
    barrier.wait(); // Threads will block here until all three are ready. 
    process_data(); 
} 

如果你只想要一個線程來處理數據,您可以檢查的wait()返回值;該函數將只返回真正的屏障線程之一。

0

你需要一個障礙。屏障具有預置容量N並且阻塞N-1個線程,直到第N個線路到達。在第N個到達之後,所有N個線程同時被釋放。

不幸的是Qt的有障礙的直接支持,但使用Qt元在這裏簡單的實現:https://stackoverflow.com/a/9639624/1854587

0

還不如提升的障礙,因爲簡單的@dauphic作爲回答,但可以使用Qt單獨來完成,使用插槽,信號和第四個線程上的另一個類。

在協調其他3的單獨線程上創建一個類,網絡線程可以在接收數據時向「協調器」類發送信號。一旦這個協調器類接收到來自所有3個網絡線程的消息,它就可以發信號通知線程處理數據。