• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            The Fourth Dimension Space

            枯葉北風寒,忽然年以殘,念往昔,語默心酸。二十光陰無一物,韶光賤,寐難安; 不畏形影單,道途阻且慢,哪曲折,如渡飛湍。斬浪劈波酬壯志,同把酒,共言歡! -如夢令

            軟件課程設計2 生產者消費者問題

            #include <windows.h>
            #include 
            <conio.h>
            #include 
            <fstream>
            #include 
            <cstdio>
            #include 
            <cmath>
            #include 
            <deque>
            using namespace std;
            #define FULL 9
            #define EMPTY 0
            int const maxn = 64;

            deque
            <int>prime;
            int nProduce=0;
            int nConsumer=0;

            HANDLE hMutex;
            HANDLE sFull;
            HANDLE sEmpty;

            struct ThreadInfo
            {
                
            int id;//進程號
                char type;//類型
                int s;//start
                int t;//end
            }
            ;

            void PrimePriority(char *file);
            void ReadThread(void *p);
            void FindThread(void *p);
            bool check(int n);//檢查是否為素數



            //main function
            int main( int agrc, char* argv[] )
            {
                
            char ch;
                prime.clear();
                
            while (true)
                
            {
                    
            // Cleare screen
                    system( "cls" );
                    
            // display prompt info
                    printf("*********************************************\n");
                    printf(
            "       1.Start test\n");
                    printf(
            "       2.Exit to Windows\n");
                    printf(
            "*********************************************\n");
                    printf(
            "Input your choice(1or2): ");
                    
            // if the number inputed is error, retry!
                    do{
                        ch 
            = (char)_getch();
                    }
            while( ch != '1' && ch != '2');

                    system ( 
            "cls" );
                    
            if ( ch == '1')
                        PrimePriority(
            "ex4.dat");
                    
            else if ( ch == '2')
                        
            return 0;
                    printf(
            "\nPress any key to finish this Program. \nThank you test this Proggram!\n");
                    _getch();
                }
             //endvalue while
            }
             //endvalue main

            bool Cheak(int n)
            {
                
            for(int i=2;i<n;i++)if(n%i==0)return false;
                
            return true;
            }



            void PrimePriority( char* file )
            {
                
            //定義
                int nThread=0;
                
            int tem;
                HANDLE hThread[maxn];
                DWORD threadID[maxn];
                ThreadInfo threadInfo[maxn];
                
            //初始化
                nProduce=nConsumer=0;
                sFull
            =CreateSemaphore(NULL,0,9,"full");
                sEmpty
            =CreateSemaphore(NULL,9,9,"empty");
                hMutex
            =CreateMutex(NULL,false,"mutex");
                
            //文件讀入
                ifstream  inFile;
                inFile.open(file);        
            //open file
                while ( inFile )
                
            {
                    
            // read every reader/writer info
                    inFile>>threadInfo[nThread].id;
                    inFile
            >>threadInfo[nThread].type;
                    inFile
            >>threadInfo[nThread].s;
                    inFile
            >>threadInfo[nThread++].t;
                    inFile.
            get();
                }

                
            //收集信息
                for(int i=0;i<nThread;i++)
                
            {
                    
            char ch=threadInfo[i].type;
                    
            if(ch=='D'||ch=='d')nConsumer++;
                    
            if(ch=='W'||ch=='w')nProduce++;
                }

                
            //創建線程
                for(int i=0;i<nThread;i++)
                
            {
                    
            char ch=threadInfo[i].type;
                    
            if(ch=='D'||ch=='d')hThread[i] = CreateThread(
                        NULL,
            0,(LPTHREAD_START_ROUTINE)ReadThread,&threadInfo[i],0,&threadID[i]);
                    
            if(ch=='W'||ch=='w')hThread[i] = CreateThread(
                        NULL,
            0,(LPTHREAD_START_ROUTINE)FindThread,&threadInfo[i],0,&threadID[i]);
                }

                WaitForMultipleObjects(nThread,hThread,
            true,INFINITE);
                printf(
            "所有線程結束\n");
                CloseHandle(hMutex);
                CloseHandle(sEmpty);
                CloseHandle(sFull);

            }
            // endvalue readerPriority



            void ReadThread(void *p)
            {
                
            //定義子Handle
                HANDLE h_Mutex;
                HANDLE s_Full;
                HANDLE s_Empty;
                
            //初始化
                s_Full = OpenSemaphore(SEMAPHORE_ALL_ACCESS,FALSE,"full");
                s_Empty 
            = OpenSemaphore(SEMAPHORE_ALL_ACCESS,FALSE,"empty");
                h_Mutex 
            = OpenMutex(MUTEX_ALL_ACCESS,FALSE,"mutex");

                
            int id,n;
                id 
            = ((ThreadInfo*)p)->id;
                n 
            = ((ThreadInfo*)p)->s;

                
            for(int i=0;i<n;i++)
                
            {

                    
            //block one
                    WaitForSingleObject(h_Mutex,INFINITE);
                    
            if(nProduce==0 && prime.empty()){
                        printf(
            "生產者已結束,數組中為空,消費者線程被迫結束\n");
                        ReleaseMutex(h_Mutex);
            //不要忘了釋放
                        break;
                    }

                    ReleaseMutex(h_Mutex);

                    
            //block two
                    WaitForSingleObject(s_Full,INFINITE);
                    WaitForSingleObject(h_Mutex,INFINITE);

                    printf(
            "消費者線程 %d[%d] 取出了第 %d 個元素: %d \n",id,n,i+1,prime.front());
                    prime.pop_front();
                    printf(
            "此時隊列中的數字為:");
                    
            for(deque<int>::iterator it=prime.begin();it!=prime.end();it++){
                        printf(
            "%d ",*it);
                    }

                    printf(
            "\n\n\n");
                    ReleaseMutex(h_Mutex);
                    ReleaseSemaphore(s_Empty,
            1,NULL);
                }

                printf(
            "消費者 %d 結束\n\n\n",id);
                nConsumer
            --;
            }



            void FindThread(void *p)
            {
                
            //定義子Handle
                HANDLE h_Mutex;
                HANDLE s_Full;
                HANDLE s_Empty;
                
            //初始化
                s_Full = OpenSemaphore(SEMAPHORE_ALL_ACCESS,FALSE,"full");
                s_Empty 
            = OpenSemaphore(SEMAPHORE_ALL_ACCESS,FALSE,"empty");
                h_Mutex 
            = OpenMutex(MUTEX_ALL_ACCESS,FALSE,"mutex");

                
            int id,s,t;
                id 
            = ((ThreadInfo*)p) -> id;
                s 
            = ((ThreadInfo*)p) -> s;
                t
            = ((ThreadInfo*)p) -> t;

                
            int primeNum=0;
                
            for(int i=s;i<=t;i++)
                    
            if(Cheak(i))primeNum++;
                
            int produceNum=0;

                
            for(int i=s;i<=t;i++)
                
            {
                    
            if(Cheak(i))
                    
            {
                        WaitForSingleObject(h_Mutex,INFINITE);
                        
            if(nConsumer==EMPTY && prime.size()==FULL)
                        
            {
                            printf(
            "消費者已經結束,存儲空間已滿\n");
                            ReleaseMutex(h_Mutex);
                            
            break;
                        }

                        ReleaseMutex(h_Mutex);
                        
            //
                        WaitForSingleObject(s_Empty,INFINITE);
                        WaitForSingleObject(h_Mutex,INFINITE);
                        printf(
            "生產者 %d[%d] 在隊尾插入了第 %d 個元素 %d \n",id,primeNum,++produceNum,i);
                        prime.push_back(i);
                        printf(
            "此時隊列中的數字為:");
                        
            for(deque<int>::iterator it=prime.begin();it!=prime.end();it++){
                            printf(
            "%d ",*it);
                        }

                        printf(
            "\n\n\n");
                        ReleaseMutex(h_Mutex);
                        ReleaseSemaphore(s_Full,
            1,NULL);

                    }

                }

                printf(
            "生產者 %d 結束.\n\n\n",id);
                CloseHandle(h_Mutex);
                CloseHandle(s_Full);
                CloseHandle(s_Empty);
                nProduce
            --;
            }

            posted on 2011-01-05 02:27 abilitytao 閱讀(844) 評論(0)  編輯 收藏 引用

            91精品观看91久久久久久| 久久久久久久久久久精品尤物 | 狠色狠色狠狠色综合久久| 精品久久久久香蕉网| 国产免费福利体检区久久 | 久久精品亚洲精品国产欧美| 少妇被又大又粗又爽毛片久久黑人 | 久久影院综合精品| 成人a毛片久久免费播放| 一本久久免费视频| 国产亚洲色婷婷久久99精品| 久久亚洲国产精品123区| 国内精品久久久久久99| 亚洲婷婷国产精品电影人久久| 99国产精品久久| 亚洲中文字幕无码久久2020| 久久婷婷国产麻豆91天堂| 色综合久久久久综合体桃花网| 久久久噜噜噜久久| 嫩草影院久久国产精品| 人人狠狠综合久久88成人| 亚洲精品久久久www| 国产视频久久| 韩国无遮挡三级久久| 无码人妻久久一区二区三区免费丨 | 区亚洲欧美一级久久精品亚洲精品成人网久久久久 | 色播久久人人爽人人爽人人片AV| 欧美亚洲另类久久综合| 久久久无码精品亚洲日韩按摩| 色综合久久天天综线观看| 久久久精品久久久久特色影视| 久久国产精品-久久精品| 久久精品人人做人人爽电影蜜月| 少妇熟女久久综合网色欲| 免费一级欧美大片久久网| 久久婷婷五月综合成人D啪| 久久91这里精品国产2020| 久久激情五月丁香伊人| 久久电影网| 色99久久久久高潮综合影院| 久久久久国色AV免费观看|