OpenThread()返回NULL Win32

时间:2009-07-01 15:35:39

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

我觉得有一个明显的答案,但它一直在逃避我。我在C ++中有一些遗留代码在尝试调用OpenThread()时会中断。我在Visual C ++ 2008 Express Edition中运行它。程序首先获取调用线程的ThreadID,并尝试打开它,如下所示:

ThreadId threadId = IsThreaded()? thread_id ::: GetCurrentThreadId();

HANDLE threadHandle = OpenThread(THREAD_ALL_ACCESS,FALSE,threadId);

现在我不明白了:如果线程ID是当前线程的ID,是不是已经打开了?这可能是它返回NULL的原因吗?

任何反馈都将不胜感激。

2 个答案:

答案 0 :(得分:6)

也许你要求过多的访问权限(THREAD_ALL_ACCESS),尽管我认为你对自己的主题拥有几乎所有的权限。尝试减少对真正需要的访问权限。

GetLastError()返回什么?

更新

看一下来自MSDN的评论:

  

Windows Server 2003和Windows   XP / 2000:大小   THREAD_ALL_ACCESS标志增加了   Windows Server 2008和Windows Vista。   如果是为Windows编译的应用程序   Server 2008和Windows Vista正在运行   在Windows Server 2003或Windows上   XP / 2000,THREAD_ALL_ACCESS标志是   太大而且功能指定   这个标志失败了   ERROR_ACCESS_DENIED。为了避免这种情况   问题,请指定最小集合   访问权限   操作。如果必须THREAD_ALL_ACCESS   使用,将_WIN32_WINNT设置为   目标最低操作系统   你的申请(例如,   #define _WIN32_WINNT _WIN32_WINNT_WINXP)。有关更多信息,请参阅使用Windows   头

答案 1 :(得分:-1)

尝试使用_beginthreadex而不是OpenThread。 例如:

HANDLE hThread;
UINT uiThreadId = 0;
hThread = (HANDLE)_beginthreadex(NULL,  // Security attributes
    0,  // stack
    &this->ThreadProc,  // Thread proc
    this,   // Thread param
    CREATE_SUSPENDED,   // creation mode
    &uiThreadId);   // Thread ID

if (hThread != NULL){
    //SetThreadPriority(hThread, THREAD_PRIORITY_HIGHEST);
    ResumeThread(hThread);
    m_hThread = hThread;
}
else{
    eRetVal = err_ThreadStartErr;
}