gpt4 book ai didi

c++ - WinAPI 的 sleep 在子线程内不起作用

转载 作者:行者123 更新时间:2023-11-30 00:51:34 26 4
gpt4 key购买 nike

我是初学者,我正在尝试重现 rae 条件,以便让自己熟悉这个问题。为此,我创建了以下程序:

#include <Windows.h>
#include <iostream>

using namespace std;

#define numThreads 1000

DWORD __stdcall addOne(LPVOID pValue)
{
int* ipValue = (int*)pValue;
*ipValue += 1;
Sleep(5000ull);
*ipValue += 1;
return 0;
}

int main()
{
int value = 0;
HANDLE threads[numThreads];

for (int i = 0; i < numThreads; ++i)
{
threads[i] = CreateThread(NULL, 0, addOne, &value, 0, NULL);
}

WaitForMultipleObjects(numThreads, threads, true, INFINITE);

cout << "resulting value: " << value << endl;
return 0;
}

我在线程的函数中添加了 sleep 以重现竞争条件,我的理解是,如果我只添加一个作为工作负载,竞争条件不会自行显现:创建一个线程,然后它运行工作负载,它恰好在另一个迭代中创建的另一个线程开始其工作负载之前完成。我的问题是工作负载中的 Sleep() 似乎被忽略了。我将参数设置为 5 秒,我希望程序至少运行 5 秒,但它会立即完成。当我将 Sleep(5000) 放在 main 函数中时,程序按预期运行(> 5 秒)。为什么 Sleep inside thread unction 会被忽略?但是无论如何,即使 Sleep() 被忽略,程序每次启动时都会输出:

结果值:1000

而正确答案应该是 2000。你能猜出为什么会这样吗?

最佳答案

WaitForMultipleObjects 只允许一次等待最多 MAXIMUM_WAIT_OBJECTS(当前为 64)个线程。如果考虑到这一点:

#include <Windows.h>
#include <iostream>

using namespace std;

#define numThreads MAXIMUM_WAIT_OBJECTS

DWORD __stdcall addOne(LPVOID pValue) {
int* ipValue=(int*)pValue;
*ipValue+=1;
Sleep(5000);
*ipValue+=1;
return 0;
}

int main() {
int value=0;
HANDLE threads[numThreads];

for (int i=0; i < numThreads; ++i) {
threads[i]=CreateThread(NULL, 0, addOne, &value, 0, NULL);
}

WaitForMultipleObjects(numThreads, threads, true, INFINITE);

cout<<"resulting value: "<<value<<endl;
return 0;
}

...一切都如您所愿。当然,您是否真的会看到竞争条件的结果是一个相当不同的故事——但在多次运行中,我确实看到结果值略有变化(例如,低值约为 125)。

关于c++ - WinAPI 的 sleep 在子线程内不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21242662/

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