CreateThread() 太慢?

Posted

技术标签:

【中文标题】CreateThread() 太慢?【英文标题】:CreateThread() too slow? 【发布时间】:2016-05-07 13:04:02 【问题描述】:

我有以下矩阵向量乘法代码:

std::chrono::steady_clock::time_point start, end2;
void fillMatrixConditions(LPVOID lpv) 
    end2 = std::chrono::steady_clock::now();
    std::cout << "Time difference = " << std::chrono::duration_cast<std::chrono::microseconds>(end2 - start).count() << std::endl;
    std::cout << "Time difference = " << std::chrono::duration_cast<std::chrono::nanoseconds> (end2 - start).count() << std::endl;
    int i, j = horizontControl;
    for (i = 0; i < horizontControl; i++, j++) 
        b[i] = akcni - uMin;
        b[j] = uMax - akcni;
    
    j = 2 * horizontControl + N - N1 + 1;
    int k = 0;
    for (i = 2 * i; i < (2 * horizontControl + N - N1 + 1); i++, j++, k++) 
        b[i] = MpDup[k] - yMin;
        b[j] = yMax - MpDup[k];
    ;
    RtPrintf("Thread");


int _tmain(int argc, _TCHAR * argv[])

    HANDLE hThread;
    DWORD id;
    int k = 0;
    double temp;
    double g[50];       
    for (int j = 0; j < N - N1 + 1; j++)
    
        temp = 0;
        for (int m = 0; m < horizontPrediction - 1; m++, k++)
        
            temp = temp + Mp[k] * dup[m];
        
        MpDup[j] = temp;
        tempMatrix[j] = setPoint - y - temp;
    
    start = std::chrono::steady_clock::now();
    hThread = CreateThread(NULL, NULL, (LPTHREAD_START_ROUTINE)fillMatrixConditions, NULL, NULL, &id);      
    k = 0;
    for (int j = 0; j < horizontControl; j++)
    
        temp = 0;
        for (int m = 0; m < N - N1 + 1; m++, k++)
        
            temp = temp + Mtranspose[k] * tempMatrix[m];
        
        g[j] = -2 * temp;
    
    RtPrintf("Point\n");    
    WaitForSingleObject(hThread, INFINITE);
    CloseHandle(hThread);
    return 0;

但是CreateThread()太慢了,因为这是程序的输出:

Point
Time difference = 247
Time difference = 247261

我认为首先要写的是线程中的Time difference,然后是“Point”。还是这个输出正常?我必须使用CreateThread()。我不能 pthread 等等。Matrix Mtranspose2025 单元格。

【问题讨论】:

努力创建一个最小、完整和可验证的示例。在这种情况下并不难:***.com/help/mcve 是的,一般来说,创建线程非常昂贵。 您的时间不准确。你正在为两件事计时。 1)创建线程需要多长时间,2)主线程执行双重嵌套循环需要多长时间。仅仅因为您创建了一个线程并不意味着它会立即开始执行。它必须等到有一个内核可供执行。在上面的代码中,它正在等待主线程在它开始执行之前放弃内核。 zeromus - 对不起我的无知。下次我会努力写得更好。否则,我感谢您的回复。我没有任何多线程经验,我想,这可以帮助我加速我的代码。 【参考方案1】:

这只是一种非常复杂的询问方式:

CreateThread 需要 247 微秒才能开始执行我的代码是否正常?

答案是肯定的,大概是正常的吧。这是一个关于这个主题的问答,它说创建一个线程需要 0.015625 毫秒,即 15 微秒:How long does thread creation and termination take under Windows? 比你的时间快,但不是瞬间的。

如果您需要更快地启动线程,您应该使用线程池并提前启动线程。

【讨论】:

好的,谢谢您的回复。我没有任何多线程经验,我想,这可以帮助我加速我的代码。

以上是关于CreateThread() 太慢?的主要内容,如果未能解决你的问题,请参考以下文章

为啥 CreateThread 不起作用?

_beginthread 和 CreateThread 区别

CreateThread 的 threadProc 竞争条件

多线程CreateThread与_beginthreadex本质区别

关于_beginthreadex和CreateThread的区别

CreateThread 执行需要多长时间?