在C ++中调用线程两次时变量重叠

时间:2013-01-22 03:55:47

标签: c++ multithreading

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

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次,我将让前两次运行什么都不做,最后一次运行就行动了。

谢谢, 本

1 个答案:

答案 0 :(得分:1)

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

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

传递params代替&params可以解决问题。 (另请注意,写入的代码会导致内存泄漏;在线程完成后,您需要确保实际free分配的空间。)