我正在尝试使用Windows CreateThread API创建和执行一个线程。我发现运行该程序会产生非确定性行为。我从程序的输出中看到,有时线程方法“我的”被执行,有时不会。可能是什么原因?该程序非常简单,如下所示。 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;
}
答案 0 :(得分:5)
我从程序的输出中看到有时是线程 方法&#34;我的&#34;得到执行,有时不执行。可能是什么原因 对此?
在你的第二个线程被执行之前,你的主线程可能会退出。调用CreateThread
后放置断点。
或者更干净的等待,只需等待使用because of eval的第二个线程。 这有效地使你的主线程等到&#34; my&#34;线程完成。
如果CreateThread
由于某种原因失败,您可以在CreateThread
之后立即致电WaitForSingleObject,它会给您最终答案。
dwThreadID应该用什么来初始化。
快速查看GetLastError以下内容:
指向接收线程标识符的变量的指针。
答案 1 :(得分:4)
无论您的线程是否执行,都是不确定的。主线程创建它然后终止程序。可能会发生以下情况:
您需要添加同步才能确保线程完成。将线程句柄传递给WaitForSingleObject
。
您的程序不会检查错误。 CreateThread
失败时返回NULL
。如果发生这种情况,并且仅在发生这种情况时,请致电GetLastError
以获取有关函数失败原因的信息。如果您添加对WaitForSingleObject
的调用,则应按文档中的说明检查其返回值是否存在错误。
dwThreadID应该用什么来初始化?
不需要初始化,因为CreateThread
保证在CreateThread
成功时分配它。
答案 2 :(得分:0)
首先不要使用CreateThread
它适用于图书馆提供商。使用beginthreadex
或std::thread
可能的行为是线程总是运行,但它的输出被覆盖。这是因为没有同步。
检查返回代码和GetLastError
dwThreadid的值无关紧要