基于MFC的模拟网络聊天窗口程序

概要:利用多线程机制模拟售票过程。有俩个线程模拟售票窗口,假设余票为100张,俩个售票窗口(线程)都在售票,并显示当前余票。使用线程互斥,为防止窗口1(线程1)到一半被窗口2(线程2)抢夺了资源,进行售票。

代码:

  1. // ConsoleApplication1.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
  2. //
  3.  
  4. #include <iostream>
  5.  
  6. // 因为需要windows的API函数
  7. #include<Windows.h>
  8.  
  9. DWORD WINAPI Fun2Pro(
  10. __in LPVOID lpParameter
  11. );
  12. DWORD WINAPI Fun3Pro(
  13. __in LPVOID lpParameter
  14. );
  15.  
  16. int ticket = 100;
  17. HANDLE hMutex;
  18.  
  19. int main()
  20. {
  21. int index = 0;
  22. // main 函数是主线程
  23. //创建线程
  24. HANDLE hThread1;
  25. HANDLE hThread2, hThread3;
  26. hThread2 = CreateThread(NULL, 0, Fun2Pro, NULL, 0, NULL);
  27. hThread3 = CreateThread(NULL, 0, Fun3Pro, NULL, 0, NULL);
  28. // 关闭句柄 关闭句柄,但没有关闭创建的线程
  29. // 只是关闭了主线程中此线程的句柄,是该线程的内核引用计数减1
  30.  
  31. CloseHandle(hThread2);
  32. CloseHandle(hThread3);
  33.  
  34. hMutex = CreateMutex(NULL,false,NULL); // 创建一个匿名的互斥对象
  35.  
  36. // 为防止子线程还未创建,主线程就退出可以添加 sleep() 让主线程暂停一小段时间
  37. Sleep(4000); // 暂停当前线程 单位毫秒
  38.  
  39. return 0;
  40. }
  41.  
  42. // 模拟 俩个线程在同时售票
  43. DWORD WINAPI Fun2Pro(
  44. LPVOID lpParameter
  45. )
  46. {
  47. while (true)
  48. {
  49. WaitForSingleObject(hMutex,INFINITE); // 申请互斥对像
  50. if (ticket > 0)
  51. {
  52. std::cout << "线程1正在售票,余票为:" << ticket-- << "\n";
  53. }
  54. else
  55. break;
  56.  
  57. //释放互斥对象的所有权
  58. ReleaseMutex(hMutex);
  59. }
  60. return 0;
  61. }
  62. DWORD WINAPI Fun3Pro(
  63. LPVOID lpParameter
  64. )
  65. {
  66. while (true)
  67. {
  68. WaitForSingleObject(hMutex, INFINITE); // 申请互斥对像
  69. if (ticket > 0)
  70. {
  71. std::cout << "线程2正在售票,余票为:" << ticket-- << "\n";
  72. }
  73. else
  74. break;
  75.  
  76. }
  77. return 0;
  78. }

结果图:

补充:

添加互斥对象是因为:

如果余票还有1时,售票窗口(线程1)正执行完判断余票是否>0的时候,时间片到期,转去执行售票窗口2(线程2),线程2将余票-1,此时余票转为0 ,在执行窗口1的时候,因为之前已经完成了判断余票的操作,即使此时余票为0,仍会执行下面的语句,这样会导致错误结果的发生。为防止这种情况,加入互斥对象。给每个线程要执行的语句加入互斥对像,当线程1在运行的时候,互斥信号为存在,其他的线程就不能执行。当线程1执行完,释放了互斥对象,线程2才能开始自己的执行。

posted @ 2020-09-03 23:07  南南子  阅读(97)  评论(0)    收藏  举报