我对多线程和线程一般都是新手; 请与我一起讨论这个问题,因为我不仅难以理解编程方面的内容,而且在涉及计算机正在做什么以及多线程如何影响性能时更是如此.我广泛搜索在线找到这个问题的答案,但无济于事.
无论如何,我目前正在编写一个程序,当达到最坏的情况时,该程序的计算成本相对较高.我已经尝试动态创建线程,这已被证明在大多数情况下可以工作,但是当最坏的情况出现时,执行速度超出了我分配给完成这些计算的时间,这主要是由于创建和破坏这些线程.这让我想到了我过去使用的想法,即在执行之前创建线程,而不是动态地创建和销毁它们,让它们在执行计算之前等待条件而不是动态创建它们.
通常我不会三思而后行,但因为我将在系统初始化时创建大量线程,所以我担心这将如何影响系统的性能.这提出了一个问题:等待条件的线程如何影响系统,如果有的话?在程序初始化期间创建线程,并且只在我需要执行计算时通知它们正确的方法来解决这个问题,还是存在一个我不知道的更好的解决方案?我也想过使用线程池来做到这一点.线程池最适合这种情况吗?
您可能会发现一些有助于更好地回答此问题的信息:
- 我正在使用boost库(版本1_54_0)来多线程程序.
- 我正在使用Windows 7和Visual Studio.
- 如果我在程序初始化时创建线程,我将创建200-1000个线程(此数字预定为#define,我不一定每次需要进行计算时都使用所有线程).
- 每次需要执行此计算时,所需的线程数会有所不同; 它取决于每次执行计算时接收的输入数量,但不能超过最大值(在编译时确定的最大数量为#define).
- 我使用的电脑有32个核心.
如果这个问题没有达到标准,我很抱歉; 我是一个新的堆栈溢出用户,所以请随时询问更多信息并批评我如何更好地解释情况和问题.预先感谢您的帮助!
UPDATE
这是源代码(某些变量已根据我公司的条款和条件重命名)
for(int i = curBlob.boundingBoxStartY; i < curBlob.boundingBoxStartY + curBlob.boundingBoxHeight; ++i)
{
for(int j = curBlob.boundingBoxStartX; j < curBlob.boundingBoxStartX + curBlob.boundingBoxWidth; ++j)
{
for(int k = 0; k < NUM_FILTERS; ++k)
{
if((int)arrayOfBinaryValues[channel][k].at<uchar>(i,j) == 1)
{
for(int p = 0; p < NUM_FILTERS; ++p)
{
if(p != k)
{
if((curBlob.boundingBoxStartX + 1 < (curBlob.boundingBoxStartX + curBlob.boundingBoxWidth)) && …Run Code Online (Sandbox Code Playgroud)