Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 在C++;_C++_Multithreading - Fatal编程技术网

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, &params, 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()
线程句柄,否则这也是资源泄漏。