




已阅读5页,还剩7页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
线程同步与异步套接字编程1.利用事件对象来实现线程间的同步新建一个win32 console application,取名Event,再建一个Event源文件,编辑:#include#includeDWORDWINAPIFun1Proc(LPVOIDlpParameter);DWORDWINAPIFun2Proc(LPVOIDlpParameter);inttickets=100;HANDLEg_hEvent;voidmain()HANDLEhThread1;HANDLEhThread2;hThread1=CreateThread(NULL,0,Fun1Proc,NULL,0,NULL);hThread2=CreateThread(NULL,0,Fun2Proc,NULL,0,NULL);CloseHandle(hThread1);CloseHandle(hThread2);/g_hEvent=CreateEvent(NULL,TRUE,FALSE,NULL);/创建一个匿名的有信号状态的事件对象/g_hEvent=CreateEvent(NULL,FALSE,FALSE,NULL);/创建一个匿名的无信号状态的事件对象g_hEvent=CreateEvent(NULL,FALSE,FALSE,tickets);/创建一个命名的无信号状态的事件对象SetEvent(g_hEvent);/将事件对象设置为有信号状态if(g_hEvent)if(ERROR_ALREADY_EXISTS=GetLastError()coutonlyoneinstancecanrun!0)Sleep(1);SetEvent(g_hEvent);coutthread1sellticket:tickets-0)Sleep(1);SetEvent(g_hEvent);coutthread2sellticket:tickets-endl;elseSetEvent(g_hEvent);/将事件对象设为有信号状态break;return0;2.利用CriticalSection实现线程同步#include#includeDWORDWINAPIFun1Proc(LPVOIDlpParameter);DWORDWINAPIFun2Proc(LPVOIDlpParameter);inttickets=100;CRITICAL_SECTIONg_cs;/定义一个全局的临界区对象voidmain()HANDLEhThread1;HANDLEhThread2;hThread1=CreateThread(NULL,0,Fun1Proc,NULL,0,NULL);hThread2=CreateThread(NULL,0,Fun2Proc,NULL,0,NULL);CloseHandle(hThread1);CloseHandle(hThread2);InitializeCriticalSection(&g_cs);/初始化一个临界区对象Sleep(4000);DeleteCriticalSection(&g_cs);/释放这个临界区对象DWORDWINAPIFun1Proc(LPVOIDlpParameter/threaddata)while(TRUE)EnterCriticalSection(&g_cs);/获得临界区的所有权,进入临界区if(tickets0)Sleep(1);coutthread1sellticket:tickets-0)Sleep(1);coutthread2sellticket:tickets-endl;elsebreak;LeaveCriticalSection(&g_cs);/离开临界区,并释放所有权return0;3.线程死锁#include#includeDWORDWINAPIFun1Proc(LPVOIDlpParameter);DWORDWINAPIFun2Proc(LPVOIDlpParameter);inttickets=100;CRITICAL_SECTIONg_csA;/定义一个全局的临界区对象CRITICAL_SECTIONg_csB;voidmain()HANDLEhThread1;HANDLEhThread2;hThread1=CreateThread(NULL,0,Fun1Proc,NULL,0,NULL);hThread2=CreateThread(NULL,0,Fun2Proc,NULL,0,NULL);CloseHandle(hThread1);CloseHandle(hThread2);InitializeCriticalSection(&g_csA);/初始化一个临界区对象InitializeCriticalSection(&g_csB);Sleep(4000);DeleteCriticalSection(&g_csA);/释放这个临界区对象DeleteCriticalSection(&g_csB);DWORDWINAPIFun1Proc(LPVOIDlpParameter/threaddata)while(TRUE)EnterCriticalSection(&g_csA);/获得临界区的所有权,进入临界区Sleep(1);EnterCriticalSection(&g_csB);if(tickets0)Sleep(1);coutthread1sellticket:tickets-0)Sleep(1);coutthread2sellticket:tickets-endl;elsebreak;LeaveCriticalSection(&g_csA);/离开临界区,并释放所有权LeaveCriticalSection(&g_csB);return0;4.利用异步套接字编写网络聊天室程序新建一个基于单文档的MFC的应用程序,取名叫Chat2,编辑资源,如下图:在预编译头文件中添加:#include/使用winsock函数要使用它#pragmacomment(lib,Ws2_32.lib)编辑函数InitInstance:BOOLCChat2App:InitInstance()WORDwVersionRequested;WSADATAwsaData;interr;wVersionRequested=MAKEWORD(2,2);err=WSAStartup(wVersionRequested,&wsaData);if(err!=0)returnFALSE;if(LOBYTE(wsaData.wVersion)!=2|HIBYTE(wsaData.wVersion)!=2)WSACleanup();returnFALSE;AfxEnableControlContainer();.添加虚函数:Chat2.h中编辑:classCChat2App:publicCWinApppublic:CChat2App();CChat2App();/增加一个析构函数,去调用WSACleanup.Chat2.cpp中编辑:CChat2App:CChat2App()WSACleanup();并在CChat2Dlg.h中添加:public:CChat2Dlg(CWnd*pParent=NULL);/standardconstructorCChat2Dlg();/析构函数private:SOCKETm_socket;在CChat2Dlg.cpp中添加:CChat2Dlg:CChat2Dlg()if(m_socket)closesocket(m_socket);再添加成员函数BOOL CChat2Dlg:InitSocket,编辑:BOOLCChat2Dlg:InitSocket()m_socket=WSASocket(AF_INET,SOCK_DGRAM,0,NULL,0,0);if(INVALID_SOCKET=m_socket)MessageBox(创建套接字失败!);returnFALSE;SOCKADDR_INaddrSock;addrSock.sin_addr.S_un.S_addr=htol(INADDR_ANY);addrSock.sin_family=AF_INET;addrScok.sin_port=htons(6000);if(SOCKET_ERROR=bind(m_socket,(SOCKET*)&addrSock,sizeof(SOCKADDR)MessageBox(绑定失败);returnFALSE;if(SOCKET_ERROR=WSAAsyncSelect(m_socket,m_hWnd,WM_SOCK,FD_READ)/请求一个基于消息的网络读取事件通知MessageBox(注册网络读取事件失败!);returnFALSE;returnTRUE;并在BOOL CChat2Dlg:OnInitDialog()调用一下:BOOLCChat2Dlg:OnInitDialog()./TODO:AddextrainitializationhereInitSocket();returnTRUE;/returnTRUEunlessyousetthefocustoacontrol接着编写WM_SOCK消息:在Chat2Dlg.h中添加:#defineUM_SOCKWM_USER+1/消息定义afx_msgvoidOnSock(WPARAM,LPARAM);/消息函数声明在Chat2Dlg.cpp中编辑:添加消息映射:BEGIN_MESSAGE_MAP(CChat2Dlg,CDialog)/AFX_MSG_MAP(CChat2Dlg)ON_WM_SYSCOMMAND()ON_WM_PAINT()ON_WM_QUERYDRAGICON()/AFX_MSG_MAPON_MESSAGE(UM_SOCK,OnSock)/消息映射END_MESSAGE_MAP()消息函数实现:voidCChat2Dlg:OnSock(WPARAMwParam,LPARAMlParama)switch(LOWORD(lParama)caseFD_READ:WSABUFwsabuf;wsabuf.buf=newchar200;wsabuf.len=200;DWORDdwRead;DWORDdwFlag=0;SOCKADDR_INaddrFrom;intlen=sizeof(SOCKADDR);CStringstr;CStringstrTemp;if(SOCKET_ERROR=WSARecvFrom(m_socket,&wsabuf,1,&dwRead,&dwFlag,(SOCKADDR*)&addrFrom,&len,NULL,NULL)/接收数据,并判断MessageBox(接收数据失败);return;str.Format(%s说:%s,inet_ntoa(addrFrom.sin_addr),wsabuf.buf);str+=rn;GetDlgItemText(IDC_EDIT_RECV,strTemp);str+=strTemp;SetDlgItemText(IDC_EDIT_RECV,str);break;双击发送按钮,接下来编写发送端:voidCChat2Dlg:OnBtnSend()/TODO:AddyourcontrolnotificationhandlercodehereDWORDdwIP;CStringstrSend;/用于存放发送的字节数WSABUFwsabuf;DWORDdwSend;intlen;(CIPAddressCtrl*)GetDlgItem(IDC_IPADDRESS1)-GetAddress(dwIP);SOCKADDR_INaddrTo;addrTo.sin_addr.S_un.S_addr=htonl(dwIP);addrTo.sin_family=AF_INET;addrTo.sin_port=htons(6000);GetDlgItemText(IDC_EDIT_SEND,strSend);/获取要发送的数据len=strSend.GetLength();wsabuf.buf=strSend.GetBuffer(len);wsabuf.len=len+1;/有一个0作为结尾SetDlgItemText(IDC_EDIT_SEND,);if(SOCKET_ERROR=WSASendTo(m_socket,&wsabuf,1,&dwSend,0,(SOCKADDR*)&addrTo,sizeof(SOCKADDR),NULL,NULL)/发送数据,并判断MessageBox(发送数据失败);return;5.利用主机名发送数据voidCChat2Dlg:OnSock(WPARAMwParam,LPARAMlParama)switch(LOWORD(lParama)caseFD_READ:WSABUFwsabuf;wsabuf.buf=newchar200;wsabuf.len=200;DWORDdwRead;DWORDdwFlag=0;SOCKADDR_INaddrFrom;intlen=sizeof(SOCKADDR);CStringstr;CStringstrTemp;HOSTENT*pHost;/定义一个HOSTENT结构体指针if(SOCKET_ERROR=WSARecvFrom(m_socket,&wsabuf,1,&dwRead,&dwFlag,(SOCKADDR*)&addrFrom,&len,NULL,NULL)/接收数据,并判断MessageBox(接收数据失败);return;pHost=gethostbyaddr(char*)&addrFrom.sin_addr.S_un.S_addr,4,AF_INET);/将地址转换成 主机名/str.Format(%s说:%s,inet_ntoa(addrFrom.sin_addr),wsabuf.buf);str.Format(%s说:%s,pHost-h_name,wsabuf.buf);str+=rn;GetDlgItemText(IDC_EDIT_RECV,strTemp);str+=strTemp;SetDlgItemText(IDC_EDIT_RECV,str);break;voidCChat2Dlg:OnBtnSend()/TODO:AddyourcontrolnotificationhandlercodehereDWORDdwIP;CStringstrSend;/用于存放发送的字节数WSABUFwsabuf;DWORDdwSend;/用于指向存放thenumberofbytessentbythiscallintlen;CStringstrHostName;SOCKADDR_INaddrTo;HOSTENT*pHost;/定义一个HOSTENT结构体if(GetDlgItemText(IDC_EDI
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 影视音乐版权独家代理授权与版权保护合同
- 美食烹饪自媒体工作室合伙人内容创作与广告合作协议
- 数字孪生城市规划与设计咨询服务协议
- 幼儿园大班音乐活动《小种子》全攻略
- 《事故伤害的防范与应对》课件
- 食堂运营团队管理规划
- ISO 17025实验室管理体系培训
- 医学检验年度总结
- 《公路路面维护与管理》课件
- 《慢性肾小球肾炎》课件
- 2025年中国AI AGENT(人工智能体)行业市场动态分析、发展方向及投资前景分析报告
- 未届期股权转让后的出资责任归属
- 企业生产计划与安全管理的协同策略研究
- 老年患者血液透析的护理
- 山东省烟台市2025届高三第二次模拟考试英语试卷含解析
- DB15T3644-2024 国有企业阳光采购规范
- 《中医经络学说》课件
- 2024年有偿服务协议书标准版
- 2024版中国质量协会QC小组基础教程(课件99)1
- 考点3 三角函数与解三角形 五年(2020-2024)高考数学真题专项分类汇编(含答案)
- 2019鲁教版高中地理选择性必修第二册《第二单元 不同类型区域的发展》大单元整体教学设计2020课标
评论
0/150
提交评论