0

我在多次调用线程时遇到问题,并且变量搞砸了。我是线程新手,所以我确定我错过了一些简单的东西。

struct PARAMS
{
    time_t secondsAtStart;
};

DWORD WINAPI ProcessChange(void* parameter) {
    PARAMS* params = (PARAMS*)parameter;
    Sleep(3000);
    _tprintf(TEXT("Seconds: (%d)\n"), params->secondsAtStart);
    return 0;
}


void FileChanged(CString filename, CString action) {
    struct PARAMS *params = NULL;
    params = (struct PARAMS *)malloc(sizeof(PARAMS)+1);
    params->secondsAtStart = time(null);
    // I've also tried it this way.    
    //PARAMS params;
    //params.secondsAtStart = time(NULL);
    HANDLE hThread = CreateThread(NULL, 0, ProcessChange, &params, 0, NULL);
    // If I uncomment this, it works, but just one thread runs at a time.
    //WaitForSingleObject(hThread, INFINITE);
}

如果我不取消注释 WaitForSingleObject,那么 secondsAtStart 变量就会损坏。我需要的最终结果是,如果 FileChanged 一个接一个地被调用 3 次,我将让前两次运行什么都不做,最后一次运行。

谢谢,本

4

1 回答 1

1

如果线程的寿命比函数长,则将函数的局部变量(即自动存储的变量)的地址(或引用)传递给线程会导致未定义的行为。

在您的代码中,params指向一个动态存储的对象,但指针本身是一个局部变量。您将其地址 &params传递给线程。这仅在等待线程完成时才有效,您可以保证指针的寿命比线程长。否则,它会导致未定义的行为,这很自然地会在打印的无意义值中表现出来。

通过params而不是&params应该解决问题。(另请注意,编写的代码会导致内存泄漏;您需要确保在线程完成free实际分配的空间。)

于 2013-01-22T04:05:29.420 回答