WINAPI CreateThread并不总是运行线程

时间:2016-03-25 06:40:46

标签: c++ windows multithreading visual-studio winapi

我正在尝试使用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;  
}

3 个答案:

答案 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它适用于图书馆提供商。使用beginthreadexstd::thread

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

检查返回代码和GetLastError

dwThreadid的值无关紧要