MFC多线程开发
线程创建函数
HANDLE CreateThread(
LPSECURITY_ATTRIBUTESlpThreadAttribute, //指向SECURITY_ATTRIBUTES结构体的指针
DWORD dwStackSize, //设置线程初始栈的大小(页面大小的整数//倍)默认为调用该函数的线程相同的栈空间大小
LPTHREAD_START_ROUTINElpStartAddress, //新线程入口函数的指针
LPVOID lpParameter, //命令行参数
DWORD dwCreationFlags, //设置控制线程创建后状态的标记
LPDWORD lpThreadId //接收线程ID
);
CloseHandle()
当不需要线程句柄时,将其关闭,让这个线程内核对象的引用减1,当引用计数为0时,系统释放该线程内核对象
线程由线程内核对象和线程栈组成,在创建它的进程环境中运行,可随意访问
进程内核对象,进程地址空间
DWORD WINAPI ThreadProc(LPVOID lpParameter);
在程序定义一个函数作为新线程的入口函数。函数名任意,但函数类型声明格式固定
Void Sleep(DWORD dwMilliseconds);
线程同步
利用互斥对象实现线程同步
HANDLE CreateMutex( //mutex互斥内核对象,当前拥有互斥对象的线程ID
//和指明拥有的次数的计数器
LPSECURITY_ATTRIBUTESlpMutexAttributes,
BOOL bInitialOwner, //指定互斥对象初始的拥有者
LPCTSTR lpName //名称
)
BOOL ReleaseMutex(HANDLE hMutex); //释放该对象的所有权,使其处于已通知状态实为//递减计数器的值
DWORD WaitForSingleObject(HANDLEhHandle,DWORD dwMilliseconds);
主动请求共享对象的使用权,dwmiliseconds为等待时间指定对象为有信号状态返回
返回值 WAIT_OBJECT_0 WAIT_TIMEOUT WAIT_ABANDONED
对于互斥对象,谁拥有谁释放
操作系统一旦发现线程已终止,自动将其拥有的互斥对象的线程ID设为0,计数器归0
保证应用程序只有一个实例(进程吗??)运行
GetLastError()函数 ERROR_ALREADY_EXISTS表明先前已经创建了这个命名的互斥对象
线程的时间片
很久以前,接触一个项目,看到一个while(1)死循环,但又发现程序经常跳出while去执行另外一段程序,甚为疑虑。其实,在多线程模式下,这是可能的,下面的程序就不会一直陷入