窗口OS下c中的CreateThread问题

时间:2010-06-29 06:17:22

标签: c++ c multithreading windows

我有以下代码启动线程。

int iNMHandleThread = 1;
HANDLE hNMHandle = 0;
hNMHandle = CreateThread( NULL, 0, NMHandle, &iNMHandleThread, 0, NULL);
if ( hNMHandle == NULL)
ExitProcess(iNMHandleThread);

我的问题是

  1. 如果我在线程已处于运行状态时运行此代码,将会发生什么。
  2. 我想发起NMHandle的多个独立线程,请给我一些提示来解决这个问题。

3 个答案:

答案 0 :(得分:2)

每次调用CreateThread时,都会启动一个独立于当前正在运行的任何其他线程的新线程。您的“NMHandle”功能是否能够一次在多个线程上运行取决于您:例如,它是否依赖于任何全局状态?

答案 1 :(得分:0)

  

如果我在线程已经处于运行状态时运行此代码,会发生什么。

另一个线程将以函数NMHandle开头,独立于另一个。

  

我想发起NMHandle的多个独立线程,请给我一些提示来解决这个问题。

此代码实际上创建了一个独立的线程。如果要创建执行函数NMHandle的多个线程,请创建一个循环。如果稍后需要线程句柄(例如等待线程结束),则必须将它们存储在某处。

确保NMHandle是线程安全的。如果您不知道这意味着什么,那么您不应该开始多线程编程!

另一个提示:您正在向线程传递指向本地堆栈变量iNMHandleThread的指针。函数返回后,变量内容可能不再具有其预期值 - 您应该将值按值传递(CreateThread( NULL, 0, NMHandle, (void*)iNMHandleThread, 0, NULL);)。

答案 2 :(得分:0)

  1. CreateThread创建一个新线程。新线程显然不能处于运行状态之前 - 它在创建之前没有状态。比较简单语句int i = 42; - 在42之前没有i的先前值,因为该对象尚不存在。显然,调用CreateThread()的旧线程必须正在运行 - 否则它无法运行到调用CreateThread()的行!

  2. 每次调用CreateThread时,都会得到一个新线程。您还将获得每个呼叫的新线程句柄和ID。因此,您无法将它们全部存储在int iNMHandleThreadHANDLE hNMHandle中。考虑std::list<int> NmThreadIDsstd::list<HANDLE> NmThreadHandles;

  3. 此外,所有新线程都将通过调用NMHandle()开始。该功能是否是线程安全的?也就是说,当两个线程同时执行,交错或以任何其他随机顺序执行时,该函数是否正常工作?互斥体和关键部分等机制可用于排除一些不安全的执行命令。