C++ WinAPI';人的睡眠不存在';不能在子线程内工作

C++ WinAPI';人的睡眠不存在';不能在子线程内工作,c++,multithreading,concurrency,C++,Multithreading,Concurrency,我是一个初学者,我正试图重现rae状态,以便熟悉这个问题。为此,我创建了以下程序: #include <Windows.h> #include <iostream> using namespace std; #define numThreads 1000 DWORD __stdcall addOne(LPVOID pValue) { int* ipValue = (int*)pValue; *ipValue += 1; Sleep(5000u

我是一个初学者,我正试图重现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;
}
#包括
#包括
使用名称空间std;
#定义numThreads 1000
DWORD_uuustdcall addOne(LPVOID pValue)
{
int*ipValue=(int*)pValue;
*ipValue+=1;
睡眠(5000ull);
*ipValue+=1;
返回0;
}
int main()
{
int值=0;
句柄线程[numThreads];
对于(int i=0;icoutWaitForMultipleObjects一次最多只允许等待\u WAIT\u对象(当前为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;
}
#包括
#包括
使用名称空间std;
#定义numThreads MAXIMUM_WAIT_对象
DWORD_uuustdcall addOne(LPVOID pValue){
int*ipValue=(int*)pValue;
*ipValue+=1;
睡眠(5000);
*ipValue+=1;
返回0;
}
int main(){
int值=0;
句柄线程[numThreads];
对于(int i=0;icoutWaitForMultipleObjects一次最多只允许等待\u WAIT\u对象(当前为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;
}
#包括
#包括
使用名称空间std;
#定义numThreads MAXIMUM_WAIT_对象
DWORD_uuustdcall addOne(LPVOID pValue){
int*ipValue=(int*)pValue;
*ipValue+=1;
睡眠(5000);
*ipValue+=1;
返回0;
}
int main(){
int值=0;
句柄线程[numThreads];
对于(int i=0;icoutJerry Coffin有正确的答案,但为了省去你的打字:

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

using namespace std;

#define numThreads 1000

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);
    }

    DWORD Status = WaitForMultipleObjects(numThreads, threads, true, INFINITE);

    assert(Status != WAIT_FAILED);

    cout << "resulting value: " << value << endl;
    return 0;
}
#包括
#包括
#包括
使用名称空间std;
#定义numThreads 1000
DWORD_uuustdcall addOne(LPVOID pValue)
{
int*ipValue=(int*)pValue;
*ipValue+=1;
睡眠(5000);
*ipValue+=1;
返回0;
}
int main()
{
int值=0;
句柄线程[numThreads];
对于(int i=0;icoutJerry Coffin有正确的答案,但为了省去你的打字:

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

using namespace std;

#define numThreads 1000

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);
    }

    DWORD Status = WaitForMultipleObjects(numThreads, threads, true, INFINITE);

    assert(Status != WAIT_FAILED);

    cout << "resulting value: " << value << endl;
    return 0;
}
#包括
#包括
#包括
使用名称空间std;
#定义numThreads 1000
DWORD_uuustdcall addOne(LPVOID pValue)
{
int*ipValue=(int*)pValue;
*ipValue+=1;
睡眠(5000);
*ipValue+=1;
返回0;
}
int main()
{
int值=0;
句柄线程[numThreads];
对于(int i=0;i睡不着API在任何线程中都能按指定的方式工作。这是不可想象的。孩子们总是睡不着。CreateThread返回时是否没有错误?@MartinJames,它是一个
无符号长
,但它不应该在那里。@OP,
MAXIMUM\u WAIT\u OBJECTS
为我报告了64个。你正在尝试等待1000个。我是通过检查
WaitForMultipleObjects
的返回值,这是您应该有的。Sleep()API在任何线程中都能按指定的方式工作。这是不可想象的。孩子们总是睡不着。CreateThread返回时是否没有错误?@MartinJames,它是一个
无符号长
,但它不应该在那里。@OP,
MAXIMUM\u WAIT\u OBJECTS
为我报告了64个。你正在尝试等待1000个。我是通过检查
WaitForMultipleObjects
的返回值,这是您应该做的。+1我一直忘了限制在那里。捕捉不错。+1我一直忘了限制在那里。捕捉不错。