我有一個程序有3個線程。它們都從不同端口上的以太網接收數據。線程中3個數據的頻率可能不同。但所有傳入的數據必須同時處理。qt中的線程同步
所以如果一個數據來自一個線程,它必須等待其他數據來。我怎麼才能得到它?
我有一個程序有3個線程。它們都從不同端口上的以太網接收數據。線程中3個數據的頻率可能不同。但所有傳入的數據必須同時處理。qt中的線程同步
所以如果一個數據來自一個線程,它必須等待其他數據來。我怎麼才能得到它?
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()
返回值;該函數將只返回真正的屏障線程之一。
你需要一個障礙。屏障具有預置容量N並且阻塞N-1個線程,直到第N個線路到達。在第N個到達之後,所有N個線程同時被釋放。
不幸的是Qt的有障礙的直接支持,但使用Qt元在這裏簡單的實現:https://stackoverflow.com/a/9639624/1854587
還不如提升的障礙,因爲簡單的@dauphic作爲回答,但可以使用Qt單獨來完成,使用插槽,信號和第四個線程上的另一個類。
在協調其他3的單獨線程上創建一個類,網絡線程可以在接收數據時向「協調器」類發送信號。一旦這個協調器類接收到來自所有3個網絡線程的消息,它就可以發信號通知線程處理數據。
您需要在線程之間進行通信,出現一些等待條件 – 4pie0