CreateThread函数:
该函数用于创建一个新的线程并在其上运行指定的函数,原型如下:
HANDLE CreateThread(
LPSECURITY_ATTRIBUTES lpThreadAttributes,
SIZE_T dwStackSize,
LPTHREAD_START_ROUTINE lpStartAddress,
LPVOID lpParameter,
DWORD dwCreationFlags,
LPDWORD lpThreadId
);
下面是示例:
#include <iostream>
#include <windows.h> //调用windows API的头文件
using namespace std;
//回调函数,格式固定
DWORD WINAPI ThreadProc(PVOID lp){
//线程的主体
//…………
return 0;
};
int main()
{
CreateThread(NULL, 0, ThreadProc, NULL, 0, 0);
return 0;
}
ThreadProc函数解释:
该函数即线程入口,ThreadProc 和 lp一样, 名字随意, ThreadProc函数本身作为CreateThread函数的第三个参数,该函数参数由CreateThread函数的第四个参数传入
DWORD的本质是 unsigned long
PVOID的本质是 void*
注意:在多线程环境中,全局变量是所有线程共享的,这意味着多个线程可以同时访问和修改这些全局变量。因为线程是并发的,所以当一个线程在执行过程中修改了全局变量的值时,其他线程在访问同一全局变量时可能会读取到这个修改后的值。
如果一个线程使用new
在堆上分配了内存,并在线程执行过程中释放了这块内存,那么其他线程在访问这块内存时可能会遇到悬挂指针(dangling pointer)或无效内存访问的问题
因此,在多线程编程中,对于共享的资源,包括全局变量和动态分配的内存(如new
操作),必须非常小心。应该通过合适的同步机制(例如互斥锁、条件变量等)来确保多个线程对这些资源的安全访问。这样可以避免潜在的竞态条件和访问无效内存的问题。
在处理动态内存时,最好的做法是由创建它的线程负责释放内存,而不是在其他线程中释放。此外,可以使用智能指针(例如std::shared_ptr
或std::unique_ptr
)来管理动态内存,这样可以避免手动释放内存的问题。