我遇到一个问题不止一次调用一个线程并且变量搞乱了。我是线程的新手,所以我确定我错过了一些简单的东西。
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, ¶ms, 0, NULL);
// If I uncomment this, it works, but just one thread runs at a time.
//WaitForSingleObject(hThread, INFINITE);
}
如果我不取消注释WaitForSingleObject,则secondsAtStart变量会被破坏。我需要的最终结果是,如果FileChanged被一个接一个地调用3次,我将让前两次运行什么都不做,最后一次运行就行动了。
谢谢, 本
答案 0 :(得分:1)
如果线程的寿命比函数长,则将函数的局部变量(或引用)的地址(即自动存储的变量)传递给线程会导致未定义的行为。
在您的代码中,params
指向动态存储的对象,但指针本身是一个局部变量。您将其地址 ¶ms
传递给该主题。这只有在等待线程完成时才能保证指针的寿命比线程长。否则会导致未定义的行为,这很自然地表现在打印的无意义的值上。
传递params
代替¶ms
可以解决问题。 (另请注意,写入的代码会导致内存泄漏;在线程完成后,您需要确保实际free
分配的空间。)