我正在尝试使用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
它是为库提供者而设计的。 使用beginthreadex
或std::thread
可能的行为是线程总是运行,但输出被覆盖。 这是因为没有同步。
检查返回码和GetLastError
dwThreadid的值并不重要