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;}
部分结果如下图所示:
- c语言多线程编程
- C#:多线程编程探索
- linux c 多线程编程
- Linux C多线程编程
- C/C++ 多线程编程
- C语言多线程编程
- Linux C 多线程编程
- linux-C编程-多线程
- Linux c 多线程编程
- C多线程编程
- 【C++】:C++多线程编程
- Linux C多线程编程
- C/C++多线程编程
- Linux C 多线程编程
- [Linux C编程]多线程
- C多线程编程-互斥量
- C多线程编程
- [Linux C编程]多线程编程
- 3432. 【GDOI2014模拟】服务器
- spring 集成 mybatis redis
- Android studio 连接模拟器 和 相关属性
- HTML之表格
- Spring的AOP面向切面编程
- C++多线程编程
- @MappedSuperclass
- 聊聊简单稳定的数字资产套利策略
- 选择器的权重
- C++排序算法之希尔排序
- C#学习笔记——属性
- 常用html
- HttpURLConnection 以及其父类URLConnection 中的方法及静态常量
- javaScript--简单表单验证