




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
概述1.1課程設(shè)計(jì)目的通過編寫一個(gè)生產(chǎn)者消費(fèi)者的實(shí)例,了解多線程的創(chuàng)建,運(yùn)行原理,通過信號(hào)量機(jī)制的運(yùn)用了解各線程間的協(xié)調(diào)工作機(jī)制;通過實(shí)現(xiàn)界面編程,了解MFC編程思想。1.2主要完成的任務(wù)如下圖所示,有多個(gè)PUT操作要不斷循環(huán)地向Buffer1送字符數(shù)據(jù),有Move1操作不斷地將Buffer1的數(shù)據(jù)取到Buffer2,Move2操作不斷地將Buffer2的數(shù)據(jù)取到Buffer3,有多個(gè)GET操作要不斷地從Buffer3中取數(shù)據(jù)。PUT、MOVE、GET每次操作一個(gè)數(shù)據(jù),為了在操作的過程中要保證數(shù)據(jù)不丟失,每個(gè)Buffer每次只能接受一個(gè)PUT或一個(gè)Move或一個(gè)Get,多個(gè)操作不能同時(shí)操作同一BUFFER。設(shè)計(jì)一個(gè)多道程序完成上述操作。Move2Move1Move2Move1Buff2GetBuff3PutBuff1Buff2GetBuff3PutBuff1圖1Buffer操作(1)可以隨機(jī)產(chǎn)生字符數(shù)據(jù),由put操作放入Buff1,buffer中容量單位是字符。(2)提供良好圖形界面,顯示Buffer的操作過程。(3)可以設(shè)定各Buffer的容量、PUT、GET、Move操作的個(gè)數(shù);(4)可以設(shè)定PUT、GET、Move操作的速度;(5)實(shí)時(shí)顯示每個(gè)Buffer中數(shù)據(jù)的個(gè)數(shù)和數(shù)據(jù)的內(nèi)容,空閑Buffer的空間的個(gè)數(shù);(6)實(shí)時(shí)顯示線程、進(jìn)程所處于等待(阻塞)狀態(tài)的個(gè)數(shù)(7)程序運(yùn)行結(jié)束,顯示匯總數(shù)據(jù):總的運(yùn)行時(shí)間;Buffer中數(shù)據(jù)的個(gè)數(shù);已放入BUFFER的數(shù)據(jù)個(gè)數(shù);已放已取的數(shù)據(jù)個(gè)數(shù);平均每個(gè)buffer中的數(shù)據(jù)個(gè)數(shù)。1.3課程設(shè)計(jì)使用的開發(fā)語(yǔ)言和工具語(yǔ)言:C++開發(fā)環(huán)境:VisualStudio2008及其開發(fā)環(huán)境下的MFC平臺(tái)。1.4解決的主要問題MFC界面設(shè)計(jì)模擬生產(chǎn)者消費(fèi)者的互斥操作各信號(hào)量的使用2使用的基本概念和原理2.1MFCMFC是Windows下程序設(shè)計(jì)的最流行的一個(gè)類庫(kù),它合理的封裝了WIN32API函數(shù),并設(shè)計(jì)了一套方便的消息映射機(jī)制。2.2MFC的消息實(shí)現(xiàn)機(jī)制在MFC的框架結(jié)構(gòu)下,可以進(jìn)行消息處理的類的頭文件里面都會(huì)含有DECLARE_MESSAGE_MAP()宏,這里主要進(jìn)行消息映射和消息處理函數(shù)的聲明。所有能夠進(jìn)行消息處理的類都是基于CCmdTarget類的,也就是說CCmdTarget類是所有可以進(jìn)行消息處理類的父類。CCmdTarget類是MFC處理命令消息的基礎(chǔ)和核心。2.3線程線程是程序獨(dú)立運(yùn)行的基本單位,一個(gè)程序通過執(zhí)行多個(gè)線程可以提高機(jī)器本身資源的利用率,同時(shí)也可以完成多任務(wù)并行運(yùn)行的操作。2.4信號(hào)量信號(hào)量是一個(gè)在一定范圍內(nèi)變化的整形數(shù)據(jù),用來表示一種臨界資源,線程通過信號(hào)量的值來確定自己的狀態(tài)是執(zhí)行還是掛起,各線程間也是通過信號(hào)量機(jī)制來協(xié)調(diào)運(yùn)行順序一起完成任務(wù)。3總體設(shè)計(jì)確定基本技術(shù)路線為面向?qū)ο蟪绦蛟O(shè)計(jì),使用MFC編寫程序,建立基本對(duì)話框。在對(duì)話框中設(shè)立生產(chǎn)者、MOVE、消費(fèi)者板塊,各板塊內(nèi)的按鈕能控制各自線程的建立、暫停以及相關(guān)數(shù)據(jù)的設(shè)定。通過創(chuàng)建生產(chǎn)者線程往BUFFER1中投放隨機(jī)產(chǎn)生的字符,創(chuàng)建MOVE1線程將BUFFER1中的字符移動(dòng)到BUFFER2中,創(chuàng)建MOVE2線程將BUFFER2中的字符移動(dòng)到BUFFER3中,創(chuàng)建消費(fèi)者線程從BUFFER3中取出字符消費(fèi)。建立信號(hào)量,因?yàn)樯a(chǎn)者線程和MOVE1線程共同使用臨界資源BUFFER1,所以用Mutex信號(hào)量來協(xié)調(diào)生產(chǎn)者線程和MOVE1線程;因?yàn)镸OVE1線程和MOVE2線程共同使用臨界資源BUFFER2,所以用Mutex1信號(hào)量來協(xié)調(diào)MOVE1線程和MOVE2線程,因?yàn)镸OVE2線程和消費(fèi)者線程共同使用臨界資源BUFFER3,所以用Mutex3信號(hào)量來協(xié)調(diào)MOVE2線程和消費(fèi)者線程。4詳細(xì)設(shè)計(jì)4.1ThreadInfo結(jié)構(gòu)體typedefstructThreadInfo{ CListBox*pList;}thread,*lpthread;此結(jié)構(gòu)體用來保存在線程建立時(shí)往線程中傳送的參數(shù)信息(如該線程指定的操作控件),以供在本線程中使用。4.2線程操作函數(shù)4.2.1執(zhí)行函數(shù)的聲明分別聲明生產(chǎn)者、MOVE1、MOVE2、消費(fèi)者函數(shù),格式為:DWORDWINAPIthreadFIFO(LPVOIDlparam);//聲明3個(gè)不同的生產(chǎn)者線程,主要區(qū)別是能分別輸出該生產(chǎn)的字符是哪個(gè)生產(chǎn)者生產(chǎn)的。DWORDWINAPIProductor1(LPVOIDpthread)DWORDWINAPIProductor2(LPVOIDpthread)DWORDWINAPIProductor3(LPVOIDpthread)//聲明MOVE1線程。DWORDWINAPIMove1(LPVOIDpthread)//聲明MOVE2線程。DWORDWINAPIMove2(LPVOIDpthread)//聲明3個(gè)不同的消費(fèi)者線程,主要區(qū)別是能分別輸出該消費(fèi)的字符是哪個(gè)消費(fèi)者消費(fèi)的。DWORDWINAPIConsumer1(LPVOIDpthread)DWORDWINAPIConsumer2(LPVOIDpthread)DWORDWINAPIConsumer3(LPVOIDpthread)4.2.2定義12個(gè)線程//3個(gè)生產(chǎn)者線程hThread1=CreateThread(NULL,0,Productor1,&thread1,0,&ProducterID);hThread2=CreateThread(NULL,0,Productor2,&thread1,0,&ProducterID);hThread7=CreateThread(NULL,0,Productor3,&thread1,0,&ProducterID);//3個(gè)MOVE1線程hThread5=CreateThread(NULL,0,Move1,&thread3,0,&MoveID[0]);hThread9=CreateThread(NULL,0,Move1,&thread3,0,&MoveID[0]);hThread10=CreateThread(NULL,0,Move1,&thread3,0,&MoveID[0]);//3個(gè)MOVE2線程hThread6=CreateThread(NULL,0,Move2,&thread4,0,&MoveID[1]);hThread11=CreateThread(NULL,0,Move2,&thread4,0,&MoveID[1]);hThread12=CreateThread(NULL,0,Move2,&thread4,0,&MoveID[1]);4.2.3各信號(hào)量的定義Mutex=CreateMutex(NULL,false,NULL);Mutex1=CreateMutex(NULL,false,NULL);Mutex2=CreateMutex(NULL,false,NULL);BufferFull=CreateSemaphore(NULL,BUFFER_SIZE1,BUFFER_SIZE1,NULL);BufferEmpty=CreateSemaphore(NULL,0,BUFFER_SIZE1,NULL);/Buffer1Full=CreateSemaphore(NULL,BUFFER_SIZE1,BUFFER_SIZE1,NULL);Buffer1Empty=CreateSemaphore(NULL,0,BUFFER_SIZE1,NULL);Buffer2Full=CreateSemaphore(NULL,BUFFER_SIZE1,BUFFER_SIZE1,NULL);Buffer2Empty=CreateSemaphore(NULL,0,BUFFER_SIZE1,NULL);4.2.4各線程的函數(shù)接口的定義及算法描述生產(chǎn)者線程函數(shù)接口:DWORDWINAPIProductor1(LPVOIDpthread){ lpthreadtemp=(lpthread)pthread; CStringstr=_T("生產(chǎn)者:"); while(control){ WaitForSingleObject(BufferFull,INFINITE);WaitForSingleObject(Mutex,INFINITE); buffer[in%BUFFER_SIZE1]=(char)('Z'-rand()%26); temp->pList->AddString(str+buffer[in%BUFFER_SIZE1]); c_Buffer.AddString(buffer[in%BUFFER_SIZE1]); in=in+1; Sleep(t1); ReleaseMutex(Mutex); ReleaseSemaphore(BufferEmpty,1,NULL); } returntrue;}MOVE1線程函數(shù)接口:DWORDWINAPIMove1(LPVOIDpthread){ intflag; lpthreadtemp=(lpthread)pthread; CStringstr=_T(""); while(control){ WaitForSingleObject(BufferEmpty,INFINITE); WaitForSingleObject(Buffer1Full,INFINITE); WaitForSingleObject(Mutex,INFINITE); WaitForSingleObject(Mutex1,INFINITE); buffer1[mov1%BUFFER_SIZE1]=buffer[mov1%BUFFER_SIZE1]; temp->pList->AddString(str+buffer1[mov1%BUFFER_SIZE1]); flag=c_Buffer.FindString(0,(LPCTSTR)buffer[mov1%BUFFER_SIZE1]); if(flag!=CB_ERR) { c_Buffer.DeleteString(flag); } buffer[mov1%BUFFER_SIZE1]="0"; mov1=mov1+1; Sleep(t2); ReleaseMutex(Mutex); ReleaseMutex(Mutex1); ReleaseSemaphore(BufferFull,1,NULL); ReleaseSemaphore(Buffer1Empty,1,NULL); } returntrue;}MOVE2線程函數(shù)接口:DWORDWINAPIMove2(LPVOIDpthread){ intflag; lpthreadtemp=(lpthread)pthread; CStringstr=_T(""); while(control){ WaitForSingleObject(Buffer1Empty,INFINITE); WaitForSingleObject(Buffer2Full,INFINITE); WaitForSingleObject(Mutex2,INFINITE); WaitForSingleObject(Mutex1,INFINITE); buffer2[mov2%BUFFER_SIZE1]=buffer1[mov2%BUFFER_SIZE1]; temp->pList->AddString(str+buffer2[mov2%BUFFER_SIZE1]); flag=c_Buffer1.FindString(0,(LPCTSTR)buffer1[mov2%BUFFER_SIZE1]); if(flag!=CB_ERR) { c_Buffer1.DeleteString(flag); } buffer1[mov2%BUFFER_SIZE1]="0"; mov2=mov2+1; Sleep(t2); ReleaseMutex(Mutex1); ReleaseMutex(Mutex2); ReleaseSemaphore(Buffer1Full,1,NULL); ReleaseSemaphore(Buffer2Empty,1,NULL); } returntrue; }消費(fèi)者線程函數(shù)的接口:DWORDWINAPIConsumer1(LPVOIDpthread){ intflag; lpthreadtemp=(lpthread)pthread; CStringstr=_T("消費(fèi)者:"); while(control){ WaitForSingleObject(Buffer2Empty,INFINITE); WaitForSingleObject(Mutex2,INFINITE); temp->pList->AddString(str+buffer2[out%BUFFER_SIZE1]); flag=c_Buffer2.FindString(0,(LPCTSTR)buffer2[out%BUFFER_SIZE1]); if(flag!=CB_ERR) { c_Buffer2.DeleteString(flag); } buffer2[out%BUFFER_SIZE1]="0"; out=out+1; Sleep(t3); ReleaseMutex(Mutex2); ReleaseSemaphore(Buffer2Full,1,NULL); } returntrue;}4.3其他輔助函數(shù)//創(chuàng)建線程響應(yīng)函數(shù)voidCConsuProduThreadDlg::OnCreateThread(){ GetDlgItem(IDC_DESTROY_THREAD)->EnableWindow(true); GetDlgItem(IDC_PRODUCTOR1)->EnableWindow(true); GetDlgItem(IDC_PRODUCTOR2)->EnableWindow(true); GetDlgItem(IDC_PRODUCTOR3)->EnableWindow(true); GetDlgItem(IDC_MOVE1)->EnableWindow(true); GetDlgItem(IDC_MOVE2)->EnableWindow(true); GetDlgItem(IDC_MOVE3)->EnableWindow(true); GetDlgItem(IDC_CONSUMER1)->EnableWindow(true); GetDlgItem(IDC_CONSUMER2)->EnableWindow(true); GetDlgItem(IDC_CONSUMER3)->EnableWindow(true); GetDlgItem(IDC_CREATE_THREAD)->EnableWindow(false); ct1=CTime::GetCurrentTime(); ((CComboBox*)GetDlgItem(IDC_COMBO1))->GetWindowText(buff); control=true; BUFFER_SIZE1=_wtoi(buff.GetBuffer()); ((CEdit*)GetDlgItem(IDC_EDIT1))->GetWindowText(T1); t1=(_tstoi(T1))*1000; ((CEdit*)GetDlgItem(IDC_EDIT2))->GetWindowText(T2); t2=(_tstoi(T2))*1000; ((CEdit*)GetDlgItem(IDC_EDIT3))->GetWindowText(T3); t3=(_tstoi(T3))*1000; Mutex=CreateMutex(NULL,false,NULL); Mutex1=CreateMutex(NULL,false,NULL); Mutex2=CreateMutex(NULL,false,NULL);BufferFull=CreateSemaphore(NULL,BUFFER_SIZE1,BUFFER_SIZE1,NULL);/BufferEmpty=CreateSemaphore(NULL,0,BUFFER_SIZE1,NULL); Buffer1Full=CreateSemaphore(NULL,BUFFER_SIZE1,BUFFER_SIZE1,NULL);Buffer1Empty=CreateSemaphore(NULL,0,BUFFER_SIZE1,NULL); Buffer2Full=CreateSemaphore(NULL,BUFFER_SIZE1,BUFFER_SIZE1,NULL);Buffer2Empty=CreateSemaphore(NULL,0,BUFFER_SIZE1,NULL); }//結(jié)束線程響應(yīng)函數(shù)voidCConsuProduThreadDlg::OnDestroyThread(){ GetDlgItem(IDC_CREATE_THREAD)->EnableWindow(true); DWORDcode; control=false; intgct1,gct2,gct3,gct4,gct5,gct6,gct7,gct8,gct9,gct10,gct11,gct12; gct1=GetExitCodeThread(hThread1,&code); gct2=GetExitCodeThread(hThread2,&code); gct3=GetExitCodeThread(hThread3,&code); gct4=GetExitCodeThread(hThread4,&code); gct5=GetExitCodeThread(hThread5,&code); gct6=GetExitCodeThread(hThread6,&code); gct7=GetExitCodeThread(hThread7,&code); gct8=GetExitCodeThread(hThread8,&code); gct9=GetExitCodeThread(hThread9,&code); gct10=GetExitCodeThread(hThread10,&code); gct11=GetExitCodeThread(hThread11,&code); gct12=GetExitCodeThread(hThread12,&code); if(gct1&&code==STILL_ACTIVE){ TerminateThread(hThread1,0); CloseHandle(hThread1); } if(gct2&&code==STILL_ACTIVE){ TerminateThread(hThread2,0); CloseHandle(hThread2); } if(gct3&&code==STILL_ACTIVE){ TerminateThread(hThread3,0); CloseHandle(hThread3); } if(gct4&&code==STILL_ACTIVE){ TerminateThread(hThread4,0); CloseHandle(hThread4); } if(gct5&&code==STILL_ACTIVE){ TerminateThread(hThread5,0); CloseHandle(hThread5); } if(gct6&&code==STILL_ACTIVE){ TerminateThread(hThread6,0); CloseHandle(hThread6); } if(gct7&&code==STILL_ACTIVE){ TerminateThread(hThread7,0); CloseHandle(hThread7); } if(gct8&&code==STILL_ACTIVE){ TerminateThread(hThread8,0); CloseHandle(hThread8); } if(gct9&&code==STILL_ACTIVE){ TerminateThread(hThread9,0); CloseHandle(hThread9); } if(gct10&&code==STILL_ACTIVE){ TerminateThread(hThread10,0); CloseHandle(hThread10); } if(gct11&&code==STILL_ACTIVE){ TerminateThread(hThread11,0); CloseHandle(hThread11); } if(gct12&&code==STILL_ACTIVE){ TerminateThread(hThread12,0); CloseHandle(hThread12); } CTimect2=CTime::GetCurrentTime(); intct11=ct1.GetSecond(); intct22=ct2.GetSecond(); intct33=ct22-ct11; CStringStr=_T("總的運(yùn)行時(shí)間:"); CStringStr1; intt; Str1.Format(TEXT("%d"),ct33); Str+=Str1; c_End.AddString(Str); Str=_T("總共生產(chǎn)的字符為:"); Str1.Format(TEXT("%d"),in); Str+=Str1; c_End.AddString(Str); Str=_T("總共消費(fèi)的字符為:"); Str1.Format(TEXT("%d"),out); Str+=Str1; c_End.AddString(Str); Str=_T("BUFFER中還剩下的字符為:"); t=in-out; Str1.Format(TEXT("%d"),t); Str+=Str1; c_End.AddString(Str); Str=_T("平均每個(gè)BUFFER中字符為:"); t=in-out; t=t/3; Str1.Format(TEXT("%d"),t); Str+=Str1; c_End.AddString(Str); GetDlgItem(IDC_PRODUCTOR1)->EnableWindow(false); GetDlgItem(IDC_PRODUCTOR2)->EnableWindow(false); GetDlgItem(IDC_PRODUCTOR3)->EnableWindow(false); GetDlgItem(IDC_MOVE1)->EnableWindow(false); GetDlgItem(IDC_MOVE2)->EnableWindow(false); GetDlgItem(IDC_MOVE3)->EnableWindow(false); GetDlgItem(IDC_CONSUMER11)->EnableWindow(false); GetDlgItem(IDC_CONSUMER22)->EnableWindow(false); GetDlgItem(IDC_CONSUMER33)->EnableWindow(false); GetDlgItem(IDC_PRODUCTOR11)->EnableWindow(false); GetDlgItem(IDC_PRODUCTOR22)->EnableWindow(false); GetDlgItem(IDC_PRODUCTOR33)->EnableWindow(false); GetDlgItem(IDC_MOVE11)->EnableWindow(false); GetDlgItem(IDC_MOVE22)->EnableWindow(false); GetDlgItem(IDC_MOVE33)->EnableWindow(false); GetDlgItem(IDC_CONSUMER1)->EnableWindow(false); GetDlgItem(IDC_CONSUMER2)->EnableWindow(false); GetDlgItem(IDC_CONSUMER3)->EnableWindow(false); GetDlgItem(IDC_ClearUp)->EnableWindow(true); }//輸出清空函數(shù)voidCConsuProduThreadDlg::OnClearUp(){ GetDlgItem(IDC_ClearUp)->EnableWindow(false); c_Productor.ResetContent(); c_Consumer.ResetContent(); c_Buffer.ResetContent(); c_Buffer1.ResetContent(); c_Buffer2.ResetContent(); c_End.ResetContent(); GetDlgItem(IDC_PRODUCTOR1)->EnableWindow(false); GetDlgItem(IDC_PRODUCTOR2)->EnableWindow(false); GetDlgItem(IDC_PRODUCTOR3)->EnableWindow(false); GetDlgItem(IDC_MOVE1)->EnableWindow(false); GetDlgItem(IDC_MOVE2)->EnableWindow(false); GetDlgItem(IDC_MOVE3)->EnableWindow(false); GetDlgItem(IDC_CONSUMER11)->EnableWindow(false); GetDlgItem(IDC_CONSUMER22)->EnableWindow(false); GetDlgItem(IDC_CONSUMER33)->EnableWindow(false); GetDlgItem(IDC_PRODUCTOR11)->EnableWindow(false); GetDlgItem(IDC_PRODUCTOR22)->EnableWindow(false); GetDlgItem(IDC_PRODUCTOR33)->EnableWindow(false); GetDlgItem(IDC_MOVE11)->EnableWindow(false); GetDlgItem(IDC_MOVE22)->EnableWindow(false); GetDlgItem(IDC_MOVE33)->EnableWindow(false); GetDlgItem(IDC_CONSUMER1)->EnableWindow(false); GetDlgItem(IDC_CONSUMER2)->EnableWindow(false); GetDlgItem(IDC_CONSUMER3)->EnableWindow(false);}5編碼設(shè)計(jì)5.1開發(fā)環(huán)境的設(shè)置和建立如圖所示選擇MFC應(yīng)用程序,輸入項(xiàng)目名稱后單擊“確定”。圖1新建項(xiàng)目再選擇“基于對(duì)話框”,之后單擊“完成”建立項(xiàng)目。如圖2:圖2MFC程序向?qū)ч_發(fā)環(huán)境建立完畢。5.2主要程序的代碼設(shè)計(jì)及注釋主要的代碼及生產(chǎn)者消費(fèi)者過程實(shí)現(xiàn)的代碼//生產(chǎn)者:while(control){ WaitForSingleObject(BufferFull,INFINITE);//表示等待緩沖區(qū)滿,將進(jìn)程掛起 WaitForSingleObject(Mutex,INFINITE);//等待互斥信號(hào)量被釋放 buffer[in%BUFFER_SIZE1]=(char)('Z'-rand()%26);//往緩沖區(qū)內(nèi)放資源,用隨機(jī)字母表示 temp->pList->AddString(str+buffer[in%BUFFER_SIZE1]); c_Buffer.AddString(buffer[in%BUFFER_SIZE1]);//將資源放入緩沖區(qū) in=in+1;//指向下一個(gè)可放資源緩沖區(qū) Sleep(t1); ReleaseMutex(Mutex);//釋放互斥信號(hào)量,允許其他進(jìn)程訪問 ReleaseSemaphore(BufferEmpty,1,NULL);//釋放信號(hào)量,對(duì)BufferEmpty信號(hào)量加操作 }//MOVE1while(control){ WaitForSingleObject(BufferEmpty,INFINITE);//表示緩沖區(qū)空,則掛起線程 WaitForSingleObject(Buffer1Full,INFINITE); WaitForSingleObject(Mutex,INFINITE);//等待互斥信號(hào)量被釋放,結(jié)束掛起線程 WaitForSingleObject(Mutex1,INFINITE);//等待互斥信號(hào)量被釋放,結(jié)束掛起線程 buffer1[mov1%BUFFER_SIZE1]=buffer[mov1%BUFFER_SIZE1]; temp->pList->AddString(str+buffer1[mov1%BUFFER_SIZE1]); flag=c_Buffer.FindString(0,(LPCTSTR)buffer[mov1%BUFFER_SIZE1]);//統(tǒng)計(jì)buffer[mov1]的內(nèi)容 if(flag!=CB_ERR)//如果返回值正常,則刪除該內(nèi)容 { c_Buffer.DeleteString(flag); } buffer[mov1%BUFFER_SIZE1]="0";//將該緩沖區(qū)置為空 mov1=mov1+1;//指向下一個(gè)可取資源的緩沖區(qū) //count--; Sleep(t2); ReleaseMutex(Mutex);//釋放互斥信號(hào)量 ReleaseMutex(Mutex1);//釋放互斥信號(hào)量,允許其他進(jìn)程訪問 ReleaseSemaphore(BufferFull,1,NULL);//釋放緩沖區(qū)滿信號(hào)量,即BufferFull信號(hào)量加 ReleaseSemaphore(Buffer1Empty,1,NULL); }//MOVE2:while(control){ WaitForSingleObject(Buffer1Empty,INFINITE);//表示緩沖區(qū)空,則掛起線程 WaitForSingleObject(Buffer2Full,INFINITE); WaitForSingleObject(Mutex2,INFINITE);//等待互斥信號(hào)量被釋放,結(jié)束掛起線程 WaitForSingleObject(Mutex1,INFINITE);//等待互斥信號(hào)量被釋放,結(jié)束掛起線程 buffer2[mov2%BUFFER_SIZE1]=buffer1[mov2%BUFFER_SIZE1]; temp->pList->AddString(str+buffer2[mov2%BUFFER_SIZE1]); flag=c_Buffer1.FindString(0,(LPCTSTR)buffer1[mov2%BUFFER_SIZE1]);//統(tǒng)計(jì)buffer[out]的內(nèi)容 if(flag!=CB_ERR)//如果返回值正常,則刪除該內(nèi)容 { c_Buffer1.DeleteString(flag); } buffer1[mov2%BUFFER_SIZE1]="0";//將該緩沖區(qū)置為空 mov2=mov2+1;//指向下一個(gè)可取資源的緩沖區(qū) Sleep(t2); ReleaseMutex(Mutex1);//釋放互斥信號(hào)量 ReleaseMutex(Mutex2);//釋放互斥信號(hào)量,允許其他進(jìn)程訪問 ReleaseSemaphore(Buffer1Full,1,NULL);//釋放緩沖區(qū)滿信號(hào)量,即BufferFull信號(hào)量加 ReleaseSemaphore(Buffer2Empty,1,NULL); }//消費(fèi)者while(control){ WaitForSingleObject(Buffer2Empty,INFINITE);//表示緩沖區(qū)空,則掛起線程 WaitForSingleObject(Mutex2,INFINITE);//等待互斥信號(hào)量被釋放,結(jié)束掛起線程 temp->pList->AddString(str+buffer2[out%BUFFER_SIZE1]); flag=c_Buffer2.FindString(0,(LPCTSTR)buffer2[out%BUFFER_SIZE1]);//統(tǒng)計(jì)buffer[out]的內(nèi)容 if(flag!=CB_ERR)//如果返回值正常,則刪除該內(nèi)容 { c_Buffer2.DeleteString(flag); } buffer2[ou
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 旅游服務(wù)合同管理合作協(xié)議
- 2025年機(jī)械制造行業(yè)技能考試-機(jī)械工程師歷年參考題庫(kù)含答案解析(5套100道單選題合輯)
- 2025年機(jī)械制造行業(yè)技能考試-數(shù)控機(jī)床裝調(diào)維修工歷年參考題庫(kù)含答案解析(5套共100道單選題合輯)
- 2025年機(jī)械制造行業(yè)技能考試-養(yǎng)路機(jī)械檢修歷年參考題庫(kù)含答案解析(5套共100道單選合輯)
- 2025年服務(wù)行業(yè)技能考試-社會(huì)體育指導(dǎo)員歷年參考題庫(kù)含答案解析(5套共100道單選題合輯)
- 2025年服務(wù)行業(yè)技能考試-家政服務(wù)員考試歷年參考題庫(kù)含答案解析(5套共100道單選題合輯)
- 2025年服務(wù)行業(yè)技能考試-一汽-大眾服務(wù)顧問考試歷年參考題庫(kù)含答案解析(5套100道單選題合輯)
- 2025年操作工技能考核考試-流體操作工考試歷年參考題庫(kù)含答案解析(5套共100道單選題合輯)
- 2025年安防生產(chǎn)行業(yè)技能考試-四級(jí)管理人員安全準(zhǔn)入考試歷年參考題庫(kù)含答案解析(5套共100道單選合輯)
- 2025年地質(zhì)礦產(chǎn)勘測(cè)行業(yè)技能鑒定考試-礦山地質(zhì)工歷年參考題庫(kù)含答案解析(5套共100道單選題合輯)
- 商場(chǎng)日常保潔服務(wù)方案投標(biāo)文件(技術(shù)方案)
- 醫(yī)院防汛救災(zāi)管理制度
- 鍋爐試題及答案
- 2025年小學(xué)美術(shù)教師招聘考試必考美術(shù)學(xué)科專業(yè)知識(shí)匯編(160題)
- DB43-T 2066-2021 河湖管理范圍劃定技術(shù)規(guī)程
- 《體重管理年行動(dòng)》科普指南課件
- uom無人機(jī)考試試題及答案
- 誤差檢測(cè)優(yōu)化策略-全面剖析
- 生態(tài)環(huán)保培訓(xùn)課件
- 2025年理財(cái)師資格考試參考題目試題及答案
- 柔性引進(jìn)團(tuán)隊(duì)協(xié)議書
評(píng)論
0/150
提交評(píng)論