gpt4 book ai didi

c++ - c++中windows-thread异常输出

转载 作者:太空宇宙 更新时间:2023-11-04 13:17:10 24 4
gpt4 key购买 nike

我是 C++ 的新手,正在做一些实验。我开始使用 CreateThread-Method 创建线程。我还传递了一个指向结构方法的指针,它引用了一个测试值。到目前为止,一切都很好。现在我在启动线程之前将值更改为 0。当我启动程序时,一切似乎都像我预期的那样工作。但是当我在 CreateThread-Method 之后也更改值(到 1)时,线程输出始终为 1。我期望输出为 0,因为我认为对变量的更改不会影响线程。或者至少首先输出 0,然后输出 1。

现在我测试了一些东西:如果我让主线程等待 5000 毫秒,则线程的输出再次始终为 0。但如果没有它,则再次为 1。

我希望你能帮助我理解这个问题。

这是一些代码:

struct TESTSTRUCT{
int test;
};

DWORD WINAPI testFunc(void* lpParam){

TESTSTRUCT& params=*((TESTSTRUCT*)lpParam);

int a=params.test;

while(true){
cout << a;
Sleep(5000);
}

return 0;
}

int main(int argc, char *argv[]) {

TESTSTRUCT teststr;
teststr.test=0;
HANDLE myhandle;
myhandle = CreateThread(0, 0, testFunc, &teststr, 0, 0);

Sleep(5000); // If left out, thread outputs always 1!

teststr.test=1;

cout << "main" << teststr.test;

CloseHandle(myhandle);

MSG msg;
while(GetMessage(&msg, NULL, 0, 0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}

最佳答案

看这个:

 myhandle = CreateThread(0, 0, testFunc, &teststr, 0, 0);

您正在传递您的 teststr通过引用你的testFunc .因此你的main方法和你的 testFunc对相同的数据进行操作。改变一个会影响另一个。

明确地说,它的工作方式是您获取 teststr 的地址, 将其转换为 void* , 然后在 testFunc 内你把它投回 TESTSTRUCT& .这与您刚刚通过 teststr 是一样的。至 testFunc通过引用。

我想我应该提一下,如果没有锁定,线程的输出就会出现竞争条件,无论 sleep 时间是多长。制作main sleep 时间足够长,通常您会看到您的线程打印“旧”值,但这并不能保证。

关于c++ - c++中windows-thread异常输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36847584/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com