Windows中的多线程程序设计一直是所有编程人员感到困难的一个地方,主要是在Windows多线程程序设计中,往往要考虑很多的东西,线程启用的多少,线程之间的同
步问题等等... 这里我将将我学习过程中碰到的问题总结在此,如果有遇到相同困惑的人也能够尽快的明白过来。
MultiThread1.cpp
#include <windows.h>
#include <iostream>
using namespace std ;
DWORD WINAPI ThreadProc1(LPVOID lpParameter) ;
DWORD WINAPI ThreadProc2(LPVOID lpParameter) ;
int index ;
int tickets = 100 ;
HANDLE hMutex ; // 声明一个全局的互斥对象句柄
int main()
{
HANDLE hThread1 ;
HANDLE hThread2 ;
hThread1 = CreateThread(NULL, 0, ThreadProc1, NULL, 0, NULL) ;
hThread2 = CreateThread(NULL, 0, ThreadProc2, NULL, 0, NULL) ;
CloseHandle(hThread1) ; // 关闭线程内核对象句柄, 并没有阻止新建线程的结束, 但是将线程内核对象的引用计数减1,
CloseHandle(hThread2) ; // 当新建线程执行完成后, 引用计数也会减1。 当引用计数为0时, 系统就会释放线程内核对象
// 如果此处不使用CloseHandle()函数关闭新建线程内核对象, 则在该线程执行完成后, 其引用计数也不会为0,
// 则该线程内核对象会一直存在在系统内核当中, 所以, 在我们创建了一个新线程之后, 如果后面的代码不会
// 用到此线程内核对象, 则应该调用CloseHandle()函数关闭该线程的线程内核对象
hMutex = CreateMutex(NULL, FALSE, NULL) ; // 创建一个不属于当前线程的匿名互斥对象
Sleep(4000) ;
return 0 ;
}
DWORD WINAPI ThreadProc1(LPVOID lpParameter)
{
while (TRUE)
{
WaitForSingleObject(hMutex, INFINITE) ;
if (tickets > 0)
{
Sleep(1) ;
cout << "thread one sell ticket: " << tickets-- << endl ;
}
else
break ;
ReleaseMutex(hMutex) ; // 释放hMutex互斥对象的所有权
}
return 0 ;
}
DWORD WINAPI ThreadProc2(LPVOID lpParameter)
{
while (TRUE)
{
WaitForSingleObject(hMutex, INFINITE) ;
if (tickets > 0)
{
Sleep(1) ;
cout << "thread two sell ticket: " << tickets-- << endl ;
}
else
break ;
ReleaseMutex(hMutex) ;
}
return 0 ;
}
代码如上,我们先看看运行的结果,如下:
我们可以看到线程一和线程二之间交替的执行,直到将票卖完。 那么这样的结果,肯定是缺少不了线程之间的同步,那么Windo