C++ 在C++;
我多次调用一个线程时遇到问题,并且变量出错。我是线程新手,所以我肯定我错过了一些简单的东西C++ 在C++;,c++,multithreading,C++,Multithreading,我多次调用一个线程时遇到问题,并且变量出错。我是线程新手,所以我肯定我错过了一些简单的东西 struct PARAMS { time_t secondsAtStart; }; DWORD WINAPI ProcessChange(void* parameter) { PARAMS* params = (PARAMS*)parameter; Sleep(3000); _tprintf(TEXT("Seconds: (%d)\n"), params->seco
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次,我将让前两次运行什么都不做,最后一次运行执行操作
谢谢,
Ben如果线程的寿命长于函数,则将函数的局部变量(即自动存储的变量)的地址(或引用)传递给线程会导致未定义的行为
在代码中,params
指向动态存储的对象,但指针本身是一个局部变量。将其地址¶ms
传递给线程。只有在等待线程完成时,才能保证指针的寿命比线程的寿命长。否则,它会导致未定义的行为,这很自然地表现为打印的无意义的值
传递
params
而不是¶ms
应该可以解决问题。(还要注意,编写的代码会导致内存泄漏;您需要确保在线程完成后实际释放分配的空间。)我看到的一个问题是,您将¶ms
传递给ProcessChange
,即已经是指针的地址。显然,这会在FileChanged
末尾超出范围时导致问题。您应该只传递params
。您所说的“secondsAtStart变量损坏”到底是什么意思?我是否认为每次调用filechange
时,您都在尝试更新secondsAtStart
,以便ProcessChange
在执行操作之前检查调用后经过的时间是否足够?除了上述解决方案之外,还有许多其他问题。首先,为什么要多分配一个字节?还有,为什么不使用新的?然后,您还可以使用unique_ptr/auto_ptr来防止泄漏。然后,就像您不编写classstd::string s=“42”代码>也不需要struct关键字。然后,将声明和初始化放在同一行中,并将其移动到您真正需要的位置。最后,您必须CloseHandle()
线程句柄,否则这也是资源泄漏。