线程的同步与互斥的实战----吃字母
希望能给你一些启发:

我们在资源输入数据,下面的两个缓冲区,通过线程获取资源的数据,吃货A-D 抢 两个缓冲区的数据
并放入对应的数据栏中。
例如:

解决思想和方案:
缓冲区的数据通过一个线程去资源栏中获取,这一个线程与下面4个吃货的线程是同步的关系,
下面4个线程是互斥的。

下面是代码:
// 9_2实战_吃字母.cpp :

// An highlighted block
// 9_2实战_吃字母.cpp : Defines the entry point for the application.
//#include "stdafx.h"
#include <stdio.h>
#include <windows.h>
#include "resource.h" //资源文件,需要包含,否则将找不到窗口的控制序号:IDC_EDIT1
HWND hEdit1; //这里是 资源栏  //这个7个窗口句柄就是 7个输入栏 依次排列
HWND hEdit2; //缓冲区1
HWND hEdit3;//缓冲区2
HWND hEdit4;//吃货A-D
HWND hEdit5;
HWND hEdit6;
HWND hEdit7;HANDLE hSemaphore2; //信号量
HANDLE hEvent1; //事件1
HANDLE hEvent2; //事件2HANDLE Thread; //这个是写入缓冲区的线程HANDLE hEat[4];//吃字母4个线程
DWORD len=0;//资源的长度
TCHAR szBuffer[100]={0}; //存放资源栏的缓冲区
TCHAR szBuff[2]={0};   //存放两个缓冲区数据
#include <stdlib.h>//随机函数 所包含的 头文件
#include <time.h>//随机函数BOOL E1=FALSE; //用于标记 吃货线程从哪个缓冲区读取数据 如果为TRUE 就从hEdit2获取,反之hEdit3
DWORD WINAPI ThreadProc1(LPVOID lpParemeter) //往两个缓冲区写入数据的线程函数 Thread
{DWORD X=0;while(szBuffer){TCHAR temp[1];memset(szBuff,0,2);WaitForSingleObject(hEvent1,INFINITE);len = strlen(szBuffer);szBuff[0] = szBuffer[len-1];GetWindowText(hEdit2,temp,1);X = rand()%2;// 随机获取0,1  根据0,1来选择将数据写入到哪个缓冲区里if(X){SetWindowText(hEdit2,szBuff);E1=TRUE;}else{SetWindowText(hEdit3,szBuff);E1=FALSE;}szBuffer[len-1]='\0';  //写完后,将长度减1ReleaseSemaphore(hSemaphore2,2,NULL);SetEvent(hEvent2);//唤醒 吃货线程抢 执行权Sleep(500);}return 0;
}DWORD WINAPI ThreadProc3(LPVOID lpParemeter)
{   TCHAR szbuffer1[3]={0};//用于获取缓冲区的数据,大于2即可TCHAR tempBuff[20]={0};//将 之前的数据取出来,加上每次从缓冲区获取的数据追记起来,再最后写入到hEditX 当中SetWindowText(hEdit4," ");while(len>0){WaitForSingleObject(hEvent2,INFINITE);WaitForSingleObject(hSemaphore2,INFINITE);if(E1){GetWindowText(hEdit2,szbuffer1,3);E1=FALSE;}else{GetWindowText(hEdit3,szbuffer1,3);E1=TRUE;}GetWindowText(hEdit4,tempBuff,20);szbuffer1[1]='-';strcat(tempBuff,szbuffer1);SetWindowText(hEdit4,tempBuff);memset(szbuffer1,0,3);memset(tempBuff,0,20);if(len<0||len==0){ReleaseSemaphore(hSemaphore2,0,NULL);SetWindowText(hEdit2,TEXT("0"));SetWindowText(hEdit3,TEXT("0"));Sleep(1000);}else{ReleaseSemaphore(hSemaphore2,1,NULL);SetEvent(hEvent1);Sleep(1000);}}return 0;
}
DWORD WINAPI ThreadProc4(LPVOID lpParemeter)
{   TCHAR szbuffer1[3]={0};TCHAR tempBuff[20]={0};SetWindowText(hEdit5," ");while(len>0){WaitForSingleObject(hEvent2,INFINITE);WaitForSingleObject(hSemaphore2,INFINITE);if(E1){GetWindowText(hEdit2,szbuffer1,3);E1=FALSE;}else{GetWindowText(hEdit3,szbuffer1,3);E1=TRUE;}GetWindowText(hEdit5,tempBuff,20);szbuffer1[1]='-';strcat(tempBuff,szbuffer1);SetWindowText(hEdit5,tempBuff);memset(szbuffer1,0,3);memset(tempBuff,0,20);if(len<0||len==0){ReleaseSemaphore(hSemaphore2,0,NULL);SetWindowText(hEdit2,TEXT("0"));SetWindowText(hEdit3,TEXT("0"));Sleep(1000);}else{ReleaseSemaphore(hSemaphore2,1,NULL);SetEvent(hEvent1);Sleep(1000);}}return 0;
}
DWORD WINAPI ThreadProc5(LPVOID lpParemeter)
{   TCHAR szbuffer1[3]={0};TCHAR tempBuff[20]={0};SetWindowText(hEdit6," ");BOOL fg=FALSE;while(len>0){WaitForSingleObject(hEvent2,INFINITE);WaitForSingleObject(hSemaphore2,INFINITE);if(E1){GetWindowText(hEdit2,szbuffer1,3);E1=FALSE;}else{GetWindowText(hEdit3,szbuffer1,3);E1=TRUE;}GetWindowText(hEdit6,tempBuff,20);szbuffer1[1]='-';strcat(tempBuff,szbuffer1);SetWindowText(hEdit6,tempBuff);memset(szbuffer1,0,3);memset(tempBuff,0,20);if(len<0||len==0){ReleaseSemaphore(hSemaphore2,0,NULL);SetWindowText(hEdit2,TEXT("0"));SetWindowText(hEdit3,TEXT("0"));Sleep(1000);}else{ReleaseSemaphore(hSemaphore2,1,NULL);SetEvent(hEvent1);Sleep(1000);}}return 0;
}
DWORD WINAPI ThreadProc6(LPVOID lpParemeter)
{   TCHAR szbuffer1[3]={0};TCHAR tempBuff[20]={0};SetWindowText(hEdit7," ");BOOL fg=FALSE;while(len>0){WaitForSingleObject(hEvent2,INFINITE);WaitForSingleObject(hSemaphore2,INFINITE);if(E1){GetWindowText(hEdit2,szbuffer1,3);E1=FALSE;}else{GetWindowText(hEdit3,szbuffer1,3);E1=TRUE;}GetWindowText(hEdit7,tempBuff,20);szbuffer1[1]='-';strcat(tempBuff,szbuffer1);SetWindowText(hEdit7,tempBuff);memset(szbuffer1,0,3);memset(tempBuff,0,20);if(len<0||len==0){ReleaseSemaphore(hSemaphore2,0,NULL);SetWindowText(hEdit2,TEXT("0"));SetWindowText(hEdit3,TEXT("0"));Sleep(1000);}else{ReleaseSemaphore(hSemaphore2,1,NULL);SetEvent(hEvent1);Sleep(1000);}}return 0;
}DWORD WINAPI ThreadMain(LPVOID lpParemeter)
{GetWindowText(hEdit1,szBuffer,100);hSemaphore2 = CreateSemaphore(NULL,0,2,NULL);hEvent1 = CreateEvent(NULL,FALSE,TRUE,NULL);hEvent2 = CreateEvent(NULL,FALSE,FALSE,NULL);Thread = CreateThread(NULL,0,ThreadProc1,NULL,0,NULL);hEat[0] = CreateThread(NULL,0,ThreadProc3,NULL,0,NULL);hEat[1] = CreateThread(NULL,0,ThreadProc4,NULL,0,NULL);hEat[2] = CreateThread(NULL,0,ThreadProc5,NULL,0,NULL);hEat[3] = CreateThread(NULL,0,ThreadProc6,NULL,0,NULL);WaitForMultipleObjects(5,hEat,TRUE,INFINITE);CloseHandle(Thread);CloseHandle(hEat[0]);CloseHandle(hEat[1]);CloseHandle(hEat[2]);CloseHandle(hEat[3]);CloseHandle(hEvent1);CloseHandle(hEvent2);CloseHandle(hSemaphore2);return 0;
}BOOL CALLBACK MainDlgProc(HWND hDlg,UINT uMsg,WPARAM wParam,LPARAM lParam)
{BOOL bRet = FALSE;switch(uMsg){case WM_CLOSE:EndDialog(hDlg,0);break;case WM_INITDIALOG:{hEdit1 = GetDlgItem(hDlg,IDC_EDIT1);hEdit2 = GetDlgItem(hDlg,IDC_EDIT2);hEdit3 = GetDlgItem(hDlg,IDC_EDIT3);hEdit4 = GetDlgItem(hDlg,IDC_EDIT4);hEdit5 = GetDlgItem(hDlg,IDC_EDIT5);hEdit6 = GetDlgItem(hDlg,IDC_EDIT6);hEdit7 = GetDlgItem(hDlg,IDC_EDIT7);SetWindowText(hEdit1,TEXT("0"));SetWindowText(hEdit2,TEXT("0"));SetWindowText(hEdit3,TEXT("0"));SetWindowText(hEdit4,TEXT("0"));SetWindowText(hEdit5,TEXT("0"));SetWindowText(hEdit6,TEXT("0"));SetWindowText(hEdit7,TEXT("0"));break;}case WM_COMMAND:switch(LOWORD(wParam)){case IDC_BUTTON_BEGIN:{::CreateThread(NULL,0,ThreadMain,NULL,0,NULL);return TRUE;}}break;}return bRet;}int APIENTRY WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR     lpCmdLine,int       nCmdShow)
{// TODO: Place code here.srand((unsigned int)time(NULL));DialogBox(hInstance,MAKEINTRESOURCE(IDD_DIALOG_MAIN),NULL,MainDlgProc);return 0;
}

例子1:

例子2:

吃字母------线程同步与互斥的学习相关推荐

  1. linux线程基础篇----线程同步与互斥

    linux线程基础----线程同步与互斥 一.同步的概念 1.同步概念  所谓同步,即同时起步,协调一致.不同的对象,对"同步"的理解方式略有不同.如,设备同步,是指在两个设备   ...

  2. C++ 线程同步之互斥锁

    文章目录 1.简介 2.std::mutex 3.线程同步 4.std::lock_guard 5.std::recursive_mutex-少用 6.std::timed_mutex 1.简介 进行 ...

  3. linux线程同步之互斥锁——linux的关键区域

    在windows中,为了让多个线程达到同步的目的,在对于全局变量等大家都要用的资源的使用上,通常得保证同时只能由一个线程在用,一个线程没有宣布对它的释放之前,不能够给其他线程使用这个变量.在windo ...

  4. 线程同步之——互斥量及死锁问题

    互斥量:多个线程同时访问共享数据时可能会冲突,这跟信号的可重性是同样的问题.如 果两个线程都要把某个全局变量增加1,这个操作在某平台需要三条指令完成: 1. 从内存读变量值到寄存器 2. 寄存器的值加 ...

  5. linux线程同步(1)-互斥量

    一.概述                                                   互斥量是线程同步的一种机制,用来保护多线程的共享资源.同一时刻,只允许一个线程对临界区进行 ...

  6. 1线程同步:互斥量,死锁

     1线程为什么要同步 A:共享资源,多个线程都可对共享资源操作. B:线程操作共享资源的先后顺序不确定. C:处理器对存储器的操作一般不是原子操作. 2互斥量 mutex操作原语 pthread_ ...

  7. 【Linux系统编程】线程同步与互斥:POSIX无名信号量

    信号量概述 信号量广泛用于进程或线程间的同步和互斥,信号量本质上是一个非负的整数计数器,它被用来控制对公共资源的访问. 编程时可根据操作信号量值的结果判断是否对公共资源具有访问的权限,当信号量值大于 ...

  8. 信号灯文件锁linux线程,linux——线程同步(互斥量、条件变量、信号灯、文件锁)...

    一.说明 linux的线程同步涉及: 1.互斥量 2.条件变量 3.信号灯 4.文件读写锁 信号灯很多时候被称为信号量,但个人仍觉得叫做信号灯比较好,因为可以与"SYSTEM V IPC的信 ...

  9. linux操作系统之线程同步及互斥量

    (1)线程同步 1)线程同步:指一个线程发出某一个功能运行时,在运行还没有结束的时候,该调用不返回.同时其它线程为保证数据的一致性,不能调用该功能. 2)多个控制流共同操作一个共享资源的时候,都需要同 ...

最新文章

  1. java session缓存_Java服务端采用Session的缓存oauth2.0授权用户信息
  2. 大家对协同管理软件是怎么理解的?协同管理软件最主要需要解决企业/组织什么问题?
  3. Ubuntu 防火墙配置小记
  4. Razor传值到js
  5. C/C++——从ctime使用到随便测一样冒泡排序和堆排序的效率
  6. 防止网页后退--禁止缓存
  7. WebFlux响应式编程基础之 5 webflux服务端开发讲解
  8. Windows Server 2008 安装详细流程 解说
  9. 堆栈的使用(部分学习)
  10. 阿里云云计算 45 阿里云云上安全
  11. Mac下配置Nginx负载均衡
  12. 局域网文件快传 暂记
  13. ORA-20011, KUP-11024 外部表引发报错
  14. python 7-1 输出星期名缩写 (10分)
  15. html中易混淆的offset、client、scroll
  16. flask----后续
  17. 10种室内定位技术原理深度解析
  18. 2020-03 前端技术汇总
  19. Python做数据分析有哪些优势?
  20. 根据excel模板导出excel

热门文章

  1. lol服务器维护 胜率,说下这游戏服务器控制胜率怎么来的。
  2. App Store2016年最新审核规则
  3. Python3 打印26个英文字母
  4. 微信PC端测试版更新:新增视频号直播工具
  5. OSChina 周三乱弹 ——送你们个漂亮妹子!
  6. 小柏实战学习Liunx(图文教程二十一)
  7. 一纸读懂另类数据 | 未央研究
  8. 第一次使用scrapy爬豆瓣top250 报错 AttributeError Requset has no attribute dont_filter 和 meta
  9. 疯狂的上网本意义何在?
  10. contiki学习笔记(四)、contiki系统UDP通信原理(单播、多播、RPL介绍)