线程,QRunnable和QThreadPool,我不能适应细节

时间:2011-03-15 18:33:31

标签: multithreading qt thread-safety threadpool

我知道一般理论,Thread,QRunnable和QThreadPool。它是如何适应的?我的意思是当创建一个QRunnable实例并分配给ThreadPool时,启动一个线程意味着什么?多个线程可以访问相同的QRunnable吗?一个QRunnable是否必须与一个工作线程一对一映射?

1 个答案:

答案 0 :(得分:12)

QRunnable封装了您想要在单独的线程中执行的任务。如果您需要知道哪个线程正在运行该任务或在线程之间共享它,那么您可能正在做一些比QThreadPool旨在赋予权力更复杂的事情。在这种情况下,您将直接使用QThread创建自定义行为。使用QThreadPool“启动”QRunnable类似于将该任务排队到池中的可用线程。然而,启动QThread实际上会分配一个新的OS线程并执行它。

线程池将使用QRunnable实例的工作队列管理有限数量的线程。当一个线程可用时,它将被分配一个QRunnable来处理。如果您正在使用带有QRunnable的QThreadPool,则无需显式创建任何QThread实例。请注意,在QRunnable实例中使用时,您仍必须确保共享资源(例如,使用QMutex,QMutexLocker,QReadWriteLock,QSemaphore和/或QWaitCondition)。