我有一个程序有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