始终有一个已创建的线程或在必要时创建线程

时间:2017-05-04 10:20:56

标签: c++ multithreading usb mutex

我正在使用用于小型USB设备的用户模式驱动程序。我的usb读取循环应该非常敏感,它执行的操作应该非常小(不必是原子的)。就像内核模式驱动程序中的中断服务程序一样。在一个处理中,我需要创建一个线程并将一些参数传递给该读取循环内的该线程。

所以我需要知道该操作的确切上限。它不会超过200毫秒,或类似的东西。

下一个选择是在设备初始化时间(探测时间)进行线程初始化,然后休眠该线程,直到我从读取线程发出信号。但在这种情况下,线程始终在运行,而且成本很高。

什么是最佳选择?我的平台是linux,他们在linux中说过,线程创建的操作非常短。我需要决定什么是最好的。保持线程始终处于活动状态或在必要时创建线程。

2 个答案:

答案 0 :(得分:2)

只需创建一次线程并使其在某些信号量或互斥锁上阻塞,直到您发出信号为止。这样它就不会“一直运行”,也不会“成本高昂”。这样你就不需要处理如下情况:“当我需要一些处理时线程没有启动怎么办”或“如果系统繁忙且线程启动缓慢怎么办”?...

只是一个小问题:如果线程不起作用,我会用较小的堆栈大小初始化它。

答案 1 :(得分:2)

现代机器有数百个,有时数千个线程被实例化,并准备好了#34;始终处于状态。 "就绪"并不意味着"实际运行"。

因此,在设备初始化时再启动一个线程并将其保持在" Ready"在大多数情况下陈述状态,并且在极少数情况下每隔一段时间做一些工作。

让这个顺利运行的技巧是确保线程阻塞等待事件发生。当一个线程正在阻塞等待信号时,它正在消耗零或接近零的CPU。

每次需要执行某项操作时启动新线程可能会非常昂贵。新线程通常需要分配内存,这可能是一个耗时的操作,尤其是在内存不足的系统中,内存分配可能会导致交换。