233上位机VC MFC使用临界区使多线程同步
233上位机VC MFC使用临界区使多线程同 功能展示 使多线程协调同步的执行任务是多线程项目程序的基本功能,实现多线程同步的方法也有很多种,我们当前例程使用临界区实现多个线程间的同步,效果如图,点击按钮,利用三个线程同步向编辑框写入三行文字; 要点提示 1.不论是硬件临界资源,还是软件临界资源,多个线程必须互斥地对它进行访问。每个线程中访问临界资源的那段代码称为临界区(Critical Section)(临界资源是一次仅允许一个线程使用的共享资源)。每次只准许一个线程进入临界区,进入后不允许其他线程进入。不论是硬件临界资源,还是软件临界资源,多个线程必须互斥地对它进行访问。 2.线程进入临界区的调度原则是:①如果有若干线程要求进入空闲的临界区,一次仅允许一个线程进入。②任何时候,处于临界区内的线程不可多于一个。如已有线程进入自己的临界区,则其它所有试图进入临界区的线程必须等待。③进入临界区的线程要在有限时间内退出,以便其它线程能及时进入自己的临界区。④如果线程不能进入自己的临界区,则应让出CPU,避免线程出现“忙等”现象。 3.临界区在使用时以CRITICAL_SECTION结构对象保护共享资源,并分别用EnterCriticalSection()和LeaveCriticalSection()函数去标识和释放一个临界区。所用到的CRITICAL_SECTION结构对象必须经过InitializeCriticalSection()的初始化后才能使用,而且必须确保所有线程中的任何试图访问此共享资源的代码都处在此临界区的保护之下。否则临界区将不会起到应有的作用,共享资源依然有被破坏的可能。 实现功能 1.新建基于对话框的应用程序 2.拖拽一编程框ID为IDC_EDIT1,修改属性多行,接收回车键,拖拽按钮关联函数 - void CGkbc8Dlg::OnButton1()
- {
- CEdit*pEdit=(CEdit*)GetDlgItem(IDC_EDIT1);
- pEdit->SetWindowText("使用临界区实现多线程同步:\r\n\r\n");//向编辑框写入文字
- InitializeCriticalSection(&g_hCritial);//初始化临界区对象
- AfxBeginThread(ThreadFun1,pEdit);
- AfxBeginThread(ThreadFun2,pEdit);
- AfxBeginThread(ThreadFun3,pEdit);
- }
复制代码3.在此函数前定义一全局变量g_hCritial及三个线程函数 - CRITICAL_SECTION g_hCritial;
- static UINT ThreadFun1(LPVOID pParam)
- {
- EnterCriticalSection(&g_hCritial);
- CEdit*pEdit=(CEdit*)pParam;
- CString sText;
- for(int i=0;i<25;i++)
- {
- pEdit->GetWindowText(sText);
- sText+="临";
- pEdit->SetWindowText(sText);
- Sleep(50);
- }
复制代码- pEdit->GetWindowText(sText);
- sText+="\r\n\r\n";
- pEdit->SetWindowText(sText);
- LeaveCriticalSection(&g_hCritial);
- return 0;
- }
- static UINT ThreadFun2(LPVOID pParam)
- {
- EnterCriticalSection(&g_hCritial);
- CEdit*pEdit=(CEdit*)pParam;
- CString sText;
- for(int i=0;i<25;i++)
- {
- pEdit->GetWindowText(sText);
- sText+="界";
- pEdit->SetWindowText(sText);
- Sleep(50);
- }
- pEdit->GetWindowText(sText);
- sText+="\r\n\r\n";
- pEdit->SetWindowText(sText);
- LeaveCriticalSection(&g_hCritial);
- return 0;
- }
- static UINT ThreadFun3(LPVOID pParam)
- {
- EnterCriticalSection(&g_hCritial);
- CEdit*pEdit=(CEdit*)pParam;
- CString sText;
复制代码- for(int i=0;i<25;i++)
- {
- pEdit->GetWindowText(sText);
- sText+="区";
- pEdit->SetWindowText(sText);
- Sleep(50);
- }
- pEdit->GetWindowText(sText);
- sText+="\r\n\r\n";
- pEdit->SetWindowText(sText);
- LeaveCriticalSection(&g_hCritial);
- return 0;
- }
复制代码我们来演示下功能实现的整个过程
|