我有以下代码启动线程。
int iNMHandleThread = 1;
HANDLE hNMHandle = 0;
hNMHandle = CreateThread( NULL, 0, NMHandle, &iNMHandleThread, 0, NULL);
if ( hNMHandle == NULL)
ExitProcess(iNMHandleThread);
我的问题是
答案 0 :(得分:2)
每次调用CreateThread
时,都会启动一个独立于当前正在运行的任何其他线程的新线程。您的“NMHandle”功能是否能够一次在多个线程上运行取决于您:例如,它是否依赖于任何全局状态?
答案 1 :(得分:0)
如果我在线程已经处于运行状态时运行此代码,会发生什么。
另一个线程将以函数NMHandle
开头,独立于另一个。
我想发起NMHandle的多个独立线程,请给我一些提示来解决这个问题。
此代码实际上创建了一个独立的线程。如果要创建执行函数NMHandle
的多个线程,请创建一个循环。如果稍后需要线程句柄(例如等待线程结束),则必须将它们存储在某处。
确保NMHandle
是线程安全的。如果您不知道这意味着什么,那么您不应该开始多线程编程!
另一个提示:您正在向线程传递指向本地堆栈变量iNMHandleThread
的指针。函数返回后,变量内容可能不再具有其预期值 - 您应该将值按值传递(CreateThread( NULL, 0, NMHandle, (void*)iNMHandleThread, 0, NULL);
)。
答案 2 :(得分:0)
CreateThread创建一个新线程。新线程显然不能处于运行状态之前 - 它在创建之前没有状态。比较简单语句int i = 42;
- 在42之前没有i的先前值,因为该对象尚不存在。显然,调用CreateThread()
的旧线程必须正在运行 - 否则它无法运行到调用CreateThread()
的行!
每次调用CreateThread时,都会得到一个新线程。您还将获得每个呼叫的新线程句柄和ID。因此,您无法将它们全部存储在int iNMHandleThread
或HANDLE hNMHandle
中。考虑std::list<int> NmThreadIDs
和std::list<HANDLE> NmThreadHandles;
。
此外,所有新线程都将通过调用NMHandle()
开始。该功能是否是线程安全的?也就是说,当两个线程同时执行,交错或以任何其他随机顺序执行时,该函数是否正常工作?互斥体和关键部分等机制可用于排除一些不安全的执行命令。