C++多线程编程

来源:互联网 发布:淘宝达人等级v2怎么升 编辑:程序博客网 时间:2024/06/05 01:53

创建线程
在Windows平台,Windows API提供了对多线程的支持。
CreateThread用于创建一个线程,其函数原型如下:
HANDLE WINAPI CreateThread(
LPSECURITY_ATTRIBUTES lpThreadAttributes, //线程安全相关的属性,常置为NULL
SIZE_T dwStackSize, //新线程的初始化栈大小,可设置为0,表示和主线程栈的大小一样, 如果不够用会自动增长
LPTHREAD_START_ROUTINE lpStartAddress, //线程函数
LPVOID lpParameter, //传入线程函数的参数,不许传递参数时为NULL
DWORD dwCreationFlage, //启动选项,0:线程建立后立即执行入口函数;CREATE_SUSPENDED:线程建立后会挂起等待
LPDWORD lpThreadId //传出参数,用于获得线程ID,如果为NULL,则不返回线程ID
);
其中线程函数的原型如下:
DWORD WINAPI ThreadProc(LPVOID lpParameter); //lpParameter是传入的参数,是一个空指针
【demo1】简单多线程实例

#include<iostream>#include<Windows.h>using namespace std;DWORD WINAPI FunProc(LPVOID lpParameter);int index=0;void main(){     HANDLE hThread;     hThread=CreateThread(NULL,0,FunProc,NULL,0,NULL);     CloseHandle(hThread);     while(index++<20)          cout<<"main is running"<<endl;     system("pause");}DWORD WINAPI FunProc(LPVOID lpParameter){     while(index++<20)          cout<<"thread is running"<<endl;     return 0;}

运行结果如图所示:
这里写图片描述
线程同步
使用互斥量进行线程同步时会用到一下3个函数:
HANDLE WINAPI CreateMutex(
LPSECURITY_ATTRIBUTES lpMutexAttributes, //线程安全相关属性,常置为NULL
BOOL bInitialOwner, //创建Mutex时的当前线程是否拥有Mutex的所有权
LPCTSTR lpName //Mutex的名称
);
DWORD WINAPI WaitForSingleObject(
HANDLE hHandle; //要获取的锁的句柄
DWORD dwMilliseconds //超时间隔,一般为INFINITE,表示无限等待,知道等待的对象处于非占用的状态
);
BOOL WINAPI ReleadeMutex(HANDLE hMutex); //释放所拥有的互斥量锁对象,hMutex为释放的互斥量的句柄
【demo2】模拟火车售票系统

#include<iostream>#include<Windows.h>using namespace std;#define NAME_LIRE 40DWORD WINAPI FunProc(LPVOID lpParameter);int tickets=100;HANDLE hMutex;typedef struct __THREAD_DATA{     int nMaxNum;     char strThreadName[NAME_LIRE];     __THREAD_DATA():nMaxNum(0)     {          memset(strThreadName,0,NAME_LIRE*sizeof(char));     }}THREAD_DATA;void main(){     THREAD_DATA threadData1,threadData2,threadData3;     strcpy(threadData1.strThreadName,"窗口A");     strcpy(threadData2.strThreadName,"窗口B");     strcpy(threadData3.strThreadName,"窗口C");     //创建互斥对象     hMutex=CreateMutex(NULL,TRUE,"tickets");     if(hMutex)     {          if(ERROR_ALREADY_EXISTS==GetLastError())          {               cout<<"only one instance can run"<<endl;               return;          }     }     //创建线程     HANDLE hThread1=CreateThread(NULL,0,FunProc,&threadData1,0,NULL);     HANDLE hThread2=CreateThread(NULL,0,FunProc,&threadData2,0,NULL);     HANDLE hThread3=CreateThread(NULL,0,FunProc,&threadData3,0,NULL);     CloseHandle(hThread1);     CloseHandle(hThread2);     CloseHandle(hThread3);     WaitForSingleObject(hMutex,INFINITE);     ReleaseMutex(hMutex);     ReleaseMutex(hMutex);     Sleep(4000);     system("pause");}//线程的入口函数DWORD WINAPI FunProc(LPVOID lpParameter){     THREAD_DATA* pThreadData=(THREAD_DATA*)lpParameter;     while(true)     {          WaitForSingleObject(hMutex,INFINITE);          if(tickets>0)          {               Sleep(1);               cout<<pThreadData->strThreadName<<"  售出第 "<<tickets--<<" 张票"<<endl;          }          else               break;          ReleaseMutex(hMutex);     }     return 0;}

部分结果如下图所示:
这里写图片描述

原创粉丝点击