为什么 CPU 使用率在 starting/stopping 个线程后不断增加?
Why is CPU usage constantly increasing after starting/stopping threads?
我有一个程序,点击一个按钮,将创建一个新线程(如果它不存在)并建立与相机的连接。现在考虑同样的流程,但有 N 个摄像头(因此在单击时创建 N 个线程)。再次点击按钮后,所有先前创建的线程都被告知停止执行(通过布尔标志),然后在每个线程上调用 Join(500) - 结束所有线程。
现在,我注意到在短时间间隔内执行的连续点击不仅会增加 CPU 使用率(8 个线程 运行 时正常),而且会保持使用率不变即使在线程据称已从对 Join(500) 的调用结束后仍保持水平。
即使在加入线程后 CPU 使用率仍然很高的原因是什么?
(注意:我也试过TPL的Task.WaitAll()实现,观察到同样的场景,所以我想说这不是由线程以某种方式不停止执行。)
编辑:
Thread[] m_threads = new Thread[8];
void Start()
{
for (int i = 0; i < m_threads.Length; i++)
{
m_threads[i] = new Thread(() =>
{
while (m_continue) { ... }
});
}
}
bool m_continue = false;
void Stop()
{
m_continue = false;
for (int i = 0; i < m_threads.Length; i++)
{
m_threads[i].Join(500);
}
}
Start 在第一次点击时调用,而 Stop 在下一次点击时调用。
尝试更改
bool m_continue = false;
至
volatile bool m_continue = false;
根据您的描述,我假设 m_continue 被缓存(在寄存器或其他地方)因此永远不会改变,即使您在 Stop() 方法中分配它也是如此。
我有一个程序,点击一个按钮,将创建一个新线程(如果它不存在)并建立与相机的连接。现在考虑同样的流程,但有 N 个摄像头(因此在单击时创建 N 个线程)。再次点击按钮后,所有先前创建的线程都被告知停止执行(通过布尔标志),然后在每个线程上调用 Join(500) - 结束所有线程。
现在,我注意到在短时间间隔内执行的连续点击不仅会增加 CPU 使用率(8 个线程 运行 时正常),而且会保持使用率不变即使在线程据称已从对 Join(500) 的调用结束后仍保持水平。
即使在加入线程后 CPU 使用率仍然很高的原因是什么?
(注意:我也试过TPL的Task.WaitAll()实现,观察到同样的场景,所以我想说这不是由线程以某种方式不停止执行。)
编辑:
Thread[] m_threads = new Thread[8];
void Start()
{
for (int i = 0; i < m_threads.Length; i++)
{
m_threads[i] = new Thread(() =>
{
while (m_continue) { ... }
});
}
}
bool m_continue = false;
void Stop()
{
m_continue = false;
for (int i = 0; i < m_threads.Length; i++)
{
m_threads[i].Join(500);
}
}
Start 在第一次点击时调用,而 Stop 在下一次点击时调用。
尝试更改
bool m_continue = false;
至
volatile bool m_continue = false;
根据您的描述,我假设 m_continue 被缓存(在寄存器或其他地方)因此永远不会改变,即使您在 Stop() 方法中分配它也是如此。