WINAPI CreateThread并不总是运行线程

我正在尝试使用Windows CreateThread API创build和执行线程。 我看到运行该程序给出了非确定性的行为。 我从程序的输出中看到,有时线程方法“我的”被执行,有时不会。 这可能是什么原因? 该程序非常简单,如下所示。 还应该dwThreadID用什么来初始化。 应该是0还是任何整数值? PS:在Visual Studio中编译。

#include "stdafx.h" #include <iostream> #include <windows.h> using namespace std; // DWORD WINAPI DWORD WINAPI my (LPVOID lpParam ) { for (int i = 0; i < 5;i++){ cout << "I am "; } return 0; } int main() { DWORD dwThreadID = 0; DWORD dwThrdParam = 0; HANDLE h = NULL; h = CreateThread( NULL, // default security 0, // default stack size my, // name of the thread function 0, // no thread parameters 0, // default startup flags &dwThreadID); if (h == NULL){ cout <<"It is null"; } cout << " BBBB" << endl ; CloseHandle(h); cout << "BBBB "; return 0; } 

我从程序的输出中看到,有时线程方法“我的”被执行,有时不会。 这可能是什么原因?

在你的第二个线程执行之前,你的主线程可能会退出。 在调用CreateThread之后放置断点。

或者更简洁的等待,只需使用WaitForSingleObject等待第二个线程。 这有效地使你的主线程等到“我的”线程完成。

如果CreateThread由于某种原因失败,你可以在CreateThread之后调用GetLastError ,它会给你最终的答案。

还应该dwThreadID用什么来初始化。

快速查看MSDN收益率如下:

指向接收线程标识符的变量的指针。

你的线程是否执行是不确定的。 主线程创建它,然后终止程序。 以下可能会发生:

  • 该线程可以在主线程终止之前执行。
  • 该程序可能会在线程执行前终止。
  • 当程序终止时,线程可能会部分执行并被终止。

您需要添加同步以确保线程完成。 将线程句柄传递给WaitForSingleObject

您的程序不检查错误。 当失败时, CreateThread返回NULL 。 如果发生这种情况,只有在发生这种情况时,请调用GetLastError获取有关为什么函数失败的信息。 如果您添加对WaitForSingleObject的调用,那么您应该按照文档所述检查其返回值的错误。

dwThreadID应该用什么来初始化?

它不需要被初始化,因为CreateThread保证它将在CreateThread成功时被分配。

首先不要使用CreateThread它是为库提供者而设计的。 使用beginthreadexstd::thread

可能的行为是线程总是运行,但输出被覆盖。 这是因为没有同步。

检查返回码和GetLastError

dwThreadid的值并不重要