亚洲AV日韩AⅤ综合手机在线观看,激情婷婷久久综合色,欧美色五月婷婷久久,久久国产精品99久久人人澡

  • <abbr id="uk6uq"><abbr id="uk6uq"></abbr></abbr>
  • <tbody id="uk6uq"></tbody>
  • 基于C++的讀者與寫者問題read—write problem的實(shí)現(xiàn)(一

    時(shí)間:2024-09-17 05:58:06 計(jì)算機(jī)畢業(yè)論文 我要投稿
    • 相關(guān)推薦

    基于C++的讀者與寫者問題read—write problem的實(shí)現(xiàn)(一)


    基于C++的讀者與寫者問題的實(shí)現(xiàn) 1
    1.設(shè)計(jì)題目與要求 1
    2.總的設(shè)計(jì)思想及系統(tǒng)平臺(tái)、語(yǔ)言、工具等 1
    2.1 設(shè)計(jì)思想 1
    2.2 系統(tǒng)平臺(tái),語(yǔ)言,工具 4
    3.?dāng)?shù)據(jù)結(jié)構(gòu)與模塊說明(功能與流程圖) 4
    3.1 功能實(shí)現(xiàn) 4
    3.2 流程圖 6
    4.源程序 7
    4.1 .ReaderAndWriter.CPP   // 具體的實(shí)現(xiàn) 7
    4.2.thread.dat //輔助的文件,但是必不可以少 15
    5.運(yùn)行結(jié)果與運(yùn)行情況 15
    6.調(diào)試記錄 17
    7.自我評(píng)析和總結(jié) 18

     

    基于C++的讀者與寫者問題read—write problem的實(shí)現(xiàn)

    1.設(shè)計(jì)題目與要求
         讀者寫者問題(read—write problem)是一個(gè)經(jīng)典的并發(fā)程序設(shè)計(jì)問題。有兩組并發(fā)進(jìn)程:讀者和寫者,共享一個(gè)問題F,要求:(1)允許多個(gè)讀者可同時(shí)對(duì)之執(zhí)行讀操作;(2)只允許一個(gè)寫者往文件中寫信息;(3)任一寫者在完成寫操作之前不允許其他讀者或者寫者工作;(4)寫者執(zhí)行寫操作前,應(yīng)讓已有的寫者和讀者全部退出。

    2.總的設(shè)計(jì)思想及系統(tǒng)平臺(tái)、語(yǔ)言、工具等
    2.1 設(shè)計(jì)思想
       根據(jù)題目要求,首先分析了以下4種可能發(fā)生的情況:
        第 1 種情況: 讀者的優(yōu)先權(quán)比寫者高,而且,不用調(diào)配。
     所有讀者的優(yōu)先權(quán)都比寫者的優(yōu)先權(quán)高,而且,不用調(diào)配。一個(gè)讀者需要等待的唯一情況是,一個(gè)寫者已經(jīng)占用了文件。一個(gè)寫者可以取得文件的條件是,沒有一個(gè)讀者處在等待狀態(tài)或正在讀文件。允許讀者們結(jié)盟,以便能長(zhǎng)期占用文件,而禁止寫者的寫。
     第 2 種情況: 在一個(gè)讀者已經(jīng)占有了文件的時(shí)候,全體讀者的優(yōu)先權(quán)才比寫者高。
     在沒有任何一個(gè)讀者在讀文件時(shí),讀者的優(yōu)先權(quán)和寫者的優(yōu)先權(quán)相同。相反,如果有一個(gè)讀者正在讀文件,則其余的各讀者都可以讀文件,而不管有多少寫者處在等待狀態(tài)。所有讀者都有權(quán)結(jié)盟,以便壟斷文件。
     第 3 種情況: 寫者的優(yōu)先權(quán)比讀者的優(yōu)先權(quán)高。
     在一個(gè)寫者提出要訪問文件時(shí),就必須使其盡可能的得到文件,而且不用調(diào)配。也就是說,在出現(xiàn)這一請(qǐng)求時(shí),占據(jù)著文件的各進(jìn)程都被執(zhí)行完以后,寫者可以立即得到文件。因此,在文件已為一寫者請(qǐng)求之后到來的那些讀者都必須等待,盡管某些讀者正在應(yīng)用文件,也是如此。所有寫者可以結(jié)盟,以便能長(zhǎng)期禁止讀者的讀。
     第 4 種情況: 所有寫者的和所有讀者有相同的優(yōu)先權(quán)高,哪一類都不會(huì)有比另一類更高的優(yōu)先權(quán)。
     如果一個(gè)讀者正在應(yīng)用文件,則在一個(gè)寫者請(qǐng)求文件之前到來的全體讀者,都能讀文件,而之后到來的讀者或?qū)懻,則要等待,不必區(qū)分他們屬于哪一類進(jìn)程。如果一個(gè)寫者正在寫文件,則所有新到來的請(qǐng)求都必須等待。在這一寫者寫完之后,它就要喚醒處在等待隊(duì)列中的排在第一個(gè)位置的進(jìn)程。如果此時(shí)有幾個(gè)讀者連續(xù)排在等待隊(duì)列中的最前面各位置上,則它們可以同時(shí)去讀文件。
     最后為了簡(jiǎn)化問題,將其分為兩種主要情況:
    (1)讀者優(yōu)先:
        如果沒有寫者正在操作,則讀者不需要等待,用一個(gè)整型變量readcount記錄當(dāng)前的讀者數(shù)目,用于確定是否釋放寫者線程,(當(dāng)readcout=0 時(shí),說明所有的讀者都已經(jīng)讀完,釋放一個(gè)寫者線程),每個(gè) 讀者開始讀之前都要修改readcount,為了互斥的實(shí)現(xiàn)對(duì)readcount 的修改,需要一個(gè)互斥對(duì)象Mutex來實(shí)現(xiàn)互斥。
        另外,為了實(shí)現(xiàn)寫-寫互斥,需要一個(gè)臨界區(qū)對(duì)象 write,當(dāng)寫者發(fā)出寫的請(qǐng)求時(shí),必須先得到臨界區(qū)對(duì)象的所有權(quán)。通過這種方法,可以實(shí)現(xiàn)讀寫互斥,當(dāng)readcount=1 時(shí),(即第一個(gè)讀者的到來時(shí),),讀者線程也必須申請(qǐng)臨界區(qū)對(duì)象的所有權(quán).
     當(dāng)讀者擁有臨界區(qū)的所有權(quán),寫者都阻塞在臨界區(qū)對(duì)象write上。當(dāng)寫者擁有臨界區(qū)對(duì)象所有權(quán)時(shí),第一個(gè)判斷完readcount==1 后,其余的讀者由于等待對(duì)readcount的判斷,阻塞在Mutex上!
    (2)寫者優(yōu)先:
     寫者優(yōu)先和讀者優(yōu)先有相同之處,不同的地方在:一旦有一個(gè)寫者到來時(shí),應(yīng)該盡快讓寫者進(jìn)行寫,如果有一個(gè)寫者在等待,則新到的讀者操作不能讀操作,為此添加一個(gè)整型變量writecount,記錄寫者的數(shù)目,當(dāng)writecount=0時(shí)才可以釋放讀者進(jìn)行讀操作!
        為了實(shí)現(xiàn)對(duì)全局變量writecount的互斥訪問,設(shè)置了一個(gè)互斥對(duì)象Mutex3。
        為了實(shí)現(xiàn)寫者優(yōu)先,設(shè)置一個(gè)臨界區(qū)對(duì)象read,當(dāng)有寫者在寫或等待時(shí),讀者必須阻塞在臨界區(qū)對(duì)象read上。
     讀者除了要一個(gè)全局變量readcount實(shí)現(xiàn)操作上的互斥外,還需要一個(gè)互斥對(duì)象對(duì)阻塞在read這一個(gè)過程實(shí)現(xiàn)互斥,這兩個(gè)互斥對(duì)象分別為mutex1和mutex2。
     測(cè)試數(shù)據(jù)文件格式:測(cè)試數(shù)據(jù)文件包括n 行測(cè)試數(shù)據(jù),分別描述創(chuàng)建的n 個(gè)線程是讀者還是寫者,以及讀寫操作的開始時(shí)間和持續(xù)時(shí)間。每行測(cè)試數(shù)據(jù)包括四個(gè)字段,各字段間用空格分隔。第一字段為一個(gè)正整數(shù),表示線程序號(hào)。第一字段表示相應(yīng)線程角色,R 表示讀者是,W 表示寫者。第二字段為一個(gè)正數(shù),表示讀寫操作的開始時(shí)間。線程創(chuàng)建后,延時(shí)相應(yīng)時(shí)間(單位為秒)后發(fā)出對(duì)共享資源的讀寫申請(qǐng)。第三字段為一個(gè)正數(shù),表示讀寫操作的持續(xù)時(shí)間。當(dāng)線程讀寫申請(qǐng)成功后,開始對(duì)共享資源的讀寫操作,該操作持續(xù)相應(yīng)時(shí)間后結(jié)束,并釋放共享資源。
     下面是一個(gè)測(cè)試數(shù)據(jù)文件的例子:
     1 R 3 5
     2 W 4 5
     3 R 5 2
     4 R 6 5
     5 W 5.1 3
     
     運(yùn)行結(jié)果顯示要求:要求在每個(gè)線程創(chuàng)建、發(fā)出讀寫操作申請(qǐng)、開始讀寫操作和結(jié)束讀寫操作時(shí)分別顯示一行提示信息,以確信所有處理都遵守相應(yīng)的讀寫操作限制。

    2.2 系統(tǒng)平臺(tái),語(yǔ)言,工具
     本次設(shè)計(jì)在WINDOWS XP操作系統(tǒng)平臺(tái)下,使用c++語(yǔ)言實(shí)現(xiàn)讀者與寫者問題。使用的軟件是Visual C++。
       

    3.?dāng)?shù)據(jù)結(jié)構(gòu)與模塊說明(功能與流程圖)
     
    3.1 功能實(shí)現(xiàn)
     相關(guān)API介紹:
     線程控制:
     CreateThread 完成線程創(chuàng)建,在調(diào)用進(jìn)程的地址空間上創(chuàng)建一個(gè)線程,以執(zhí)行指定的函數(shù);它的返回值為所創(chuàng)建線程的句柄。
     HANDLE CreateThread(
     LPSECURITY_ATTRIBUTES lpThreadAttributes, // SD
     DWORD dwStackSize, // initial stack size
     LPTHREAD_START_ROUTINElpStartAddress, // thread function
     LPVOID lpParameter, // thread argument
     DWORD dwCreationFlags, // creation option
     LPDWORD lpThreadId // thread identifier
     );
     ExitThread 用于結(jié)束當(dāng)前線程。
     VOID ExitThread(DWORD dwExitCode // exit code for this thread);
     Sleep 可在指定的時(shí)間內(nèi)掛起當(dāng)前線程。
     VOID Sleep(DWORD dwMilliseconds // sleep time);
     信號(hào)量控制:
     CreateMutex 創(chuàng)建一個(gè)互斥對(duì)象,返回對(duì)象句柄;
     HANDLE CreateMutex(
     LPSECURITY_ATTRIBUTES lpMutexAttributes, // SD
     BOOL bInitialOwner, // initial owner
     LPCTSTR lpName // object name);
     OpenMutex 打開并返回一個(gè)已存在的互斥對(duì)象句柄,用于后續(xù)訪問;
     HANDLE OpenMutex(
     DWORD dwDesiredAccess, // access
     BOOL bInheritHandle, // inheritance option
     LPCTSTR lpName // object name);
     ReleaseMutex 釋放對(duì)互斥對(duì)象的占用,使之成為可用。
     BOOL ReleaseMutex(
     HANDLE hMutex // handle to mutex);
     WaitForSingleObject 可在指定的時(shí)間內(nèi)等待指定對(duì)象為可用狀態(tài);
     DWORD WaitForSingleObject(
     HANDLE hHandle, // handle to object
     DWORD dwMilliseconds // time-out interval);
      測(cè)試文件數(shù)據(jù)結(jié)構(gòu)如下: 
      struct ThreadInfo
     {
     int serial;                      //線程序號(hào)
     char entity;                    //線程類別(判斷是讀者還是寫者線程)
     double delay;                    //線程延遲時(shí)間
     double persist;                  //線程讀寫操作時(shí)間
     };
    void RP_ReaderThread(void *p)       // 讀者優(yōu)先情況下的讀者線程信息
    void RP_WriterThread(void *p)       //讀者優(yōu)先情況下的寫者線程信息
    void ReaderPriority(char *file)     //讀者優(yōu)先處理函數(shù)
    void WP_ReaderThread(void *p)           //寫者優(yōu)先情況下的讀者線程信息
    void WP_ReaderThread(void *p)          //寫者優(yōu)先情況下的寫者線程信息
    void WriterPriority(char *file)     //寫者優(yōu)先處理函數(shù)
    int main(int argc,char *argv     //主函數(shù),負(fù)責(zé)調(diào)用讀者或者寫者優(yōu)先函數(shù)
    3.2 流程圖
        

                                        否
                                     
                           是

         是                                    否
                                   否 
                     否                             是            否
                                    是
                                                      是
                      否
             否

                       是

     

     

     
    4.源程序
    4.1 .ReaderAndWriter.CPP   // 具體的實(shí)現(xiàn)
     #include "windows.h"
     #include <conio.h>
     #include <stdlib.h>
     #include <fstream.h>
     #include <io.h>
     #include <string.h>
     #include <stdio.h>
     
     #define READER 'R'                   //讀者
     #define WRITER 'W'                   //寫者
     #define INTE_PER_SEC 1000            //每秒時(shí)鐘中斷的數(shù)目
     #define MAX_THREAD_NUM 64            //最大線程數(shù)
     #define MAX_FILE_NUM 32              //最大文件數(shù)目數(shù)
     #define MAX_STR_LEN 32               //字符串的長(zhǎng)度

    int readcount=0;                     //讀者數(shù)目
    int writecount=0;                    //寫者數(shù)目
    CRITICAL_SECTION RP_Write;           //臨界資源
    CRITICAL_SECTION cs_Write;
    CRITICAL_SECTION cs_Read;
    struct ThreadInfo
    {
     int serial;                      //線程序號(hào)
     char entity;                     //線程類別(判斷是讀者還是寫者線程)
     double delay;                    //線程延遲時(shí)間
     double persist;                  //線程讀寫操作時(shí)間
    };
    ///////////////////////////////////////////////////////////////////////////
    // 讀者優(yōu)先---讀者線程
    //P:讀者線程信息

    void RP_ReaderThread(void *p)
    {
     //互斥變量
     HANDLE h_Mutex;
     h_Mutex=OpenMutex(MUTEX_ALL_ACCESS,FALSE,"mutex_for_readcount");
     
     
     DWORD wait_for_mutex;            //等待互斥變量所有權(quán)
     DWORD m_delay;                   //延遲時(shí)間
     DWORD m_persist;                 //讀文件持續(xù)時(shí)間
     int m_serial;                    //線程序號(hào)
     //  從參數(shù)中獲得信息
     m_serial=((ThreadInfo*)(p))->serial ;
     m_delay=(DWORD)(((ThreadInfo*)(p))->delay *INTE_PER_SEC);
     m_persist=(DWORD)(((ThreadInfo*)(p))->persist *INTE_PER_SEC);
     Sleep(m_delay);                  //延遲等待
     printf("Reader thread %d sents the reading require.\n",m_serial);
     
     //等待互斥信號(hào),保證對(duì)ReadCount 的訪問,修改互斥
     wait_for_mutex=WaitForSingleObject(h_Mutex,-1);
     //讀者數(shù)目增加
     readcount++;
     if(readcount==1)
     {
      //第一個(gè)讀者,等待資源
      EnterCriticalSection(&RP_Write);
     }
     ReleaseMutex(h_Mutex);            //釋放互斥信號(hào)
     //讀文件
     printf("Reader thread %d begins to read file.\n",m_serial);
    Sleep(m_persist);

     //退出線程
     printf("Reader thread %d finished reading file.\n",m_serial);
     //等待互斥信號(hào),保證對(duì)ReadCount的訪問,修改互斥
     wait_for_mutex=WaitForSingleObject(h_Mutex,-1);
     //讀者數(shù)目減少
      readcount--;
      if(readcount==0)
      {
       //如果所有的讀者讀完,喚醒寫者
       LeaveCriticalSection(&RP_Write);
      }
      ReleaseMutex(h_Mutex);          //釋放互斥信號(hào)
    }
    //////////////////////////////////////////////////////////////
    //P:寫者線程信息

    void RP_WriterThread(void *p)
    {
     DWORD m_delay;                   //延遲時(shí)間
     DWORD m_persist;                 //寫文件持續(xù)時(shí)間
     int m_serial;                    //線程序號(hào)
     //  從參數(shù)中獲得信息
     m_serial=((ThreadInfo*)(p))->serial ;
     m_delay=(DWORD)(((ThreadInfo*)(p))->delay *INTE_PER_SEC);
     m_persist=(DWORD)(((ThreadInfo*)(p))->persist *INTE_PER_SEC);
     Sleep(m_delay);
     
     printf("Write thread %d sents the writing require.\n",m_serial);
     //等待資源
     EnterCriticalSection(&RP_Write);
     //寫文件
     printf("Writer thread %d begins to write to the file.\n",m_serial);
     Sleep(m_persist);

     //退出線程
    printf("Write thread %d finished writing to the file.\n",m_serial);
     //釋放資源
     LeaveCriticalSection(&RP_Write);
    }

    //////////////////////////////////////////////////////////////
    //讀者優(yōu)先處理函數(shù)
    //file:文件名

    void ReaderPriority(char *file)
    {
     DWORD n_thread=0;           //線程數(shù)目
     DWORD thread_ID;            //線程ID
     DWORD wait_for_all;         //等待所有線程結(jié)束
     //互斥對(duì)象
     HANDLE h_Mutex;
     h_Mutex=CreateMutex(NULL,FALSE,"mutex_for_readcount");

     //線程對(duì)象的數(shù)組
     HANDLE h_Thread[MAX_THREAD_NUM];
     ThreadInfo thread_info[MAX_THREAD_NUM];

     readcount=0;               //初始化readcount
     InitializeCriticalSection(&RP_Write);        //初始化臨界區(qū)
     ifstream inFile;
     inFile.open (file);
     printf("Reader Priority:\n\n");
     while(inFile)
     {
      //讀入每一個(gè)讀者,寫者的信息
      inFile>>thread_info[n_thread].serial;
      inFile>>thread_info[n_thread].entity;
      inFile>>thread_info[n_thread].delay;
      inFile>>thread_info[n_thread++].persist;
      inFile.get();
     }
     for(int i=0;i<(int)(n_thread);i++)
    {
      if(thread_info[i].entity==READER||thread_info[i].entity =='r')
      {
       //創(chuàng)建讀者進(jìn)程
       h_Thread[i]=CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)(RP_ReaderThread),&thread_info[i],0,&thread_ID);
      }
      else
      {
       //創(chuàng)建寫線程
       h_Thread[i]=CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)(RP_WriterThread),&thread_info[i],0,&thread_ID);
      }

     }
     //等待所有的線程結(jié)束
     wait_for_all=WaitForMultipleObjects(n_thread,h_Thread,TRUE,-1);
     printf("All reader and writer have finished operating.\n");
    }

    ////////////////////////////////////////////////////////
    //寫者優(yōu)先---讀者線程
    //P:讀者線程信息


    void WP_ReaderThread(void *p)
    {

     //互斥變量
     HANDLE h_Mutex1;
     h_Mutex1=OpenMutex(MUTEX_ALL_ACCESS,FALSE,"mutex1");
     HANDLE h_Mutex2;
        h_Mutex2=OpenMutex(MUTEX_ALL_ACCESS,FALSE,"mutex2");

     DWORD wait_for_mutex1;            //等待互斥變量所有權(quán)
     DWORD wait_for_mutex2;
     DWORD m_delay;                     //延遲時(shí)間
     DWORD m_persist;                   //讀文件持續(xù)時(shí)間
     int m_serial;                      //線程的序號(hào)
     //從參數(shù)中得到信息
     m_serial=((ThreadInfo*)(p))->serial ;

     m_delay=(DWORD)(((ThreadInfo*)(p))->delay *INTE_PER_SEC);
     m_persist=(DWORD)(((ThreadInfo*)(p))->persist *INTE_PER_SEC);
     Sleep(m_delay);                  //延遲等待

     printf("Reader thread %d sents the reading require.\n",m_serial);
     wait_for_mutex1=WaitForSingleObject(h_Mutex1,-1);

     //讀者進(jìn)去臨界區(qū)
     EnterCriticalSection(&cs_Read);

     //阻塞互斥對(duì)象Mutex2,保證對(duì)readCount的訪問和修改互斥
      wait_for_mutex2=WaitForSingleObject(h_Mutex2,-1);
      //修改讀者的數(shù)目
      readcount++;
      if(readcount==1)
      {
       // 如果是第1個(gè)讀者,等待寫者寫完
       EnterCriticalSection(&cs_Write);
      }
      ReleaseMutex(h_Mutex2);// 釋放互斥信號(hào) Mutex2
      //讓其他讀者進(jìn)去臨界區(qū)
      LeaveCriticalSection(&cs_Read);
      ReleaseMutex(h_Mutex1);
      //讀文件
      printf("Reader thread %d begins to read file.\n",m_serial);
      Sleep(m_persist);

      //退出線程
       printf("Reader thread %d finished reading  file.\n",m_serial);
       //阻塞互斥對(duì)象Mutex2,保證對(duì)readcount的訪問,修改互斥
       wait_for_mutex2=WaitForSingleObject(h_Mutex2,-1);
       readcount--;
       if(readcount==0)
       {
        //最后一個(gè)讀者,喚醒寫者
        LeaveCriticalSection(&cs_Write);
       }
       ReleaseMutex(h_Mutex2);  //釋放互斥信號(hào)
    }
    ///////////////////////////////////////////
    //寫者優(yōu)先---寫者線程
    //P:寫者線程信息


    void WP_WriterThread(void *p)
    {
     DWORD wait_for_mutex3;            //互斥變量
     DWORD m_delay;                   //延遲時(shí)間
     DWORD m_persist;                 //讀文件持續(xù)時(shí)間
     int m_serial;                    //線程序號(hào)

     HANDLE h_Mutex3;
     h_Mutex3=OpenMutex(MUTEX_ALL_ACCESS,FALSE,"mutex3");

     //從參數(shù)中獲得信息
     m_serial=((ThreadInfo*)(p))->serial ;
     m_delay=(DWORD)(((ThreadInfo*)(p))->delay *INTE_PER_SEC);
     m_persist=(DWORD)(((ThreadInfo*)(p))->persist *INTE_PER_SEC);
     Sleep(m_delay);                  //延遲等待

     printf("Writer thread %d sents the reading require.\n",m_serial);
     wait_for_mutex3=WaitForSingleObject(h_Mutex3,-1);
     writecount++;               //修改寫者數(shù)目
     if(writecount==1)
     {
      EnterCriticalSection(&cs_Read);
     }
     ReleaseMutex(h_Mutex3);
     EnterCriticalSection(&cs_Write);
     printf("Writer thread %d begins to write to the file.\n",m_serial);
     Sleep(m_persist);

     printf("Writer thread %d finished writing to the file.\n",m_serial);
     LeaveCriticalSection(&cs_Write);

     wait_for_mutex3=WaitForSingleObject(h_Mutex3,-1);
     writecount--;
     if(writecount==0)
     {
      LeaveCriticalSection(&cs_Read);
     }
    ReleaseMutex(h_Mutex3);
    }
    /////////////////////////////////////////////
    //寫者優(yōu)先處理函數(shù)
    // file:文件名

    void WriterPriority(char * file)
    {
     DWORD n_thread=0;
     DWORD thread_ID;
     DWORD wait_for_all;


     HANDLE h_Mutex1;
     h_Mutex1=CreateMutex(NULL,FALSE,"mutex1");
     HANDLE h_Mutex2;
     h_Mutex2=CreateMutex(NULL,FALSE,"mutex2");
     HANDLE h_Mutex3;
     h_Mutex3=CreateMutex(NULL,FALSE,"mutex3");
     HANDLE h_Thread[MAX_THREAD_NUM];
     ThreadInfo thread_info[MAX_THREAD_NUM];

     readcount=0;
     writecount=0;
     InitializeCriticalSection(&cs_Write);
     InitializeCriticalSection(&cs_Read);
     
     ifstream inFile;
     inFile.open (file);
     printf("Writer priority:\n\n");
     while(inFile)
     {
      inFile>>thread_info[n_thread].serial;
      inFile>>thread_info[n_thread].entity;
      inFile>>thread_info[n_thread].delay;
      inFile>>thread_info[n_thread++].persist;
      inFile.get();
     }
     for(int i=0;i<(int)(n_thread);i++)
     {
      if(thread_info[i].entity==READER||thread_info[i].entity =='r')
      {
       //創(chuàng)建讀者進(jìn)程
     h_Thread[i]=CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)(WP_ReaderThread),&thread_info[i],0,&thread_ID);
      }
      else
      {
       //創(chuàng)建寫線程
       h_Thread[i]=CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)(WP_WriterThread),&thread_info[i],0,&thread_ID);
      }

     }
     //等待所有的線程結(jié)束
     wait_for_all=WaitForMultipleObjects(n_thread,h_Thread,TRUE,-1);
     printf("All reader and writer have finished operating.\n");
    }

    /////////////////////////////////////////////////////
    //主函數(shù)
    int main(int argc,char *argv[])
    {
     char ch;
     while(true)
     {
      printf("*************************************\n");
      printf("   1.Reader Priority\n");
      printf("   2.Writer Priority\n");
      printf("   3.Exit to Windows\n");
      printf("*************************************\n");
      printf("Enter your choice(1,2,3): ");
      do{
       ch=(char)_getch();
      }while(ch!='1'&&ch!='2'&&ch!='3');
      system("cls");
      if(ch=='3')
       return 0;
      else if(ch=='1')
       ReaderPriority("thread.dat");
      else
       WriterPriority("thread.dat");
      printf("\nPress Any Key to Coutinue:");
      _getch();
      system("cls");
    }
     return 0;
    }

    4.2.thread.dat //輔助的文件,但是必不可以少
     
     1  r   3  5
     2  w   4  5
     3  r   5   2
     4  r   6   5
     5  w   5.1  3
     


    5.運(yùn)行結(jié)果與運(yùn)行情況
       對(duì)源程序進(jìn)行編譯,鏈接后,執(zhí)行程序:

     
     當(dāng)選擇1 Reader Priority 時(shí),程序運(yùn)行結(jié)果如下:
     

     

    按任意建后會(huì)到主界面,然后選擇2.Writer Priority 后,程序運(yùn)行結(jié)果如下:
       

     

    6.調(diào)試記錄
     在編程過程中,沒有設(shè)置計(jì)數(shù)器來存儲(chǔ)讀者數(shù)目,結(jié)果在程序運(yùn)行時(shí),產(chǎn)生了讀者與讀者的互斥。之后通過翻閱資料,了解了需要加入計(jì)數(shù)器來控制讀者與讀者之間的同等優(yōu)先,同時(shí)也用于控制寫者進(jìn)程的釋放,既當(dāng)計(jì)數(shù)器為0的時(shí)候,允許寫進(jìn)程訪問文件。
     在加入計(jì)數(shù)器后,重新編寫程序,就解決了以上問題。當(dāng)程序通過編譯鏈接之后,運(yùn)行程序,得到了正確的結(jié)果。然后修改文件thread.dat中的參數(shù):
    1 R 3 4
    2 R 4 3
    3 W 4 5
     重新對(duì)程序進(jìn)行測(cè)試,分別選擇讀者優(yōu)先和寫者優(yōu)先,結(jié)果正確。
     最后修改文件thread.dat中的參數(shù),使用更多的讀寫請(qǐng)求:
    1 W 2 5
    2 R 3 4
    3 W 5 3
    4 R 6 5
    5 R 7 4
    6 W 9 5
    7 R 11 4
    8 R 14 5
    9 W 17 6
    10 R 20 5
       運(yùn)行程序的結(jié)果都正確。讀者寫者問題程序設(shè)計(jì)成功。
    7.自我評(píng)析和總結(jié)
     課程設(shè)計(jì)是培養(yǎng)學(xué)生綜合運(yùn)用所學(xué)知識(shí),發(fā)現(xiàn),提出,分析和解決實(shí)際問題,鍛煉實(shí)踐能力的重要環(huán)節(jié),是對(duì)學(xué)生實(shí)際工作能力的具體訓(xùn)練和考察過程.
     操作系統(tǒng)的出現(xiàn),使用和發(fā)展是近四十余年來計(jì)算機(jī)軟件的一個(gè)重大進(jìn)展。操作系統(tǒng)中引入并發(fā)程序設(shè)計(jì)技術(shù)后,程序的執(zhí)行不在是順序的。一個(gè)程序未執(zhí)行完而另一個(gè)程序便已開始執(zhí)行,程序挖補(bǔ)的順序特性消失,程序與計(jì)算不再一一對(duì)應(yīng),所以操作系統(tǒng)引進(jìn)進(jìn)程概念來描述這種變化。讀者與寫者問題就是一個(gè)經(jīng)典的并發(fā)程序設(shè)計(jì)問題。
     在開始做課程設(shè)計(jì)時(shí),我首先翻閱了很多關(guān)于并發(fā)程序的書籍,找到了基本的解決方法,那就是信號(hào)量的使用。記錄型信號(hào)量和PV操作不僅可以解決進(jìn)程的互斥,而且更是實(shí)現(xiàn)進(jìn)程同步的有力工具。但是發(fā)現(xiàn)光有信號(hào)量是解決不了讀者和寫者問題,因?yàn)樗凶x進(jìn)程不會(huì)相互互斥。所以程序?qū)π盘?hào)量進(jìn)行了改進(jìn)。引入了一個(gè)計(jì)數(shù)器,記錄讀者的數(shù)目,控制是否釋放寫者進(jìn)程。
     做到這些,思路已經(jīng)基本確定。在變成過程中查閱了許多書籍,也對(duì)WINDOWS下的一些API做了些了解。
     接近2周的課程設(shè)計(jì),讓我學(xué)到了不少東西,從開始的查閱書籍,確定思路,到最后的編寫程序和調(diào)試。設(shè)計(jì)過程中遇到了不少困難,但在同學(xué)和老師的幫助下都一一克服了。
     總之,每一次課程設(shè)計(jì)不僅是我們學(xué)習(xí)的好機(jī)會(huì),而且是我們鍛煉實(shí)際動(dòng)手能力的平臺(tái),雖然有難度的東西總會(huì)讓人很抵觸,比如在課設(shè)過程中有很多郁悶的時(shí)候,一個(gè)小小的錯(cuò)誤一不小心就花去了自己一上午的時(shí)間,所以在這個(gè)過程中能夠磨練人的意志與耐心,最后感謝老師的指導(dǎo)與監(jiān)督,使我在課程設(shè)計(jì)過程中學(xué)到了書本是學(xué)不到的知識(shí),同時(shí)也對(duì)操作系統(tǒng)有了更深刻的認(rèn)識(shí),為以后的學(xué)習(xí)打下了堅(jiān)實(shí)的基礎(chǔ)。

    【基于C++的讀者與寫者問題read—write problem的實(shí)現(xiàn)(一】相關(guān)文章:

    數(shù)據(jù)加密標(biāo)準(zhǔn)DES的C++實(shí)現(xiàn)03-07

    基于圖像的OMR技術(shù)的實(shí)現(xiàn)03-07

    基于XMLSchema的元數(shù)據(jù)方案實(shí)現(xiàn)03-21

    基于LabVIEW的GMSK調(diào)制與解調(diào)實(shí)現(xiàn)03-07

    基于FPGA的HDLC通信模塊的實(shí)現(xiàn)05-14

    基于Perl的DoS工具設(shè)計(jì)與實(shí)現(xiàn)03-10

    基于PQRM的PACS系統(tǒng)設(shè)計(jì)與實(shí)現(xiàn)03-07

    一種基于網(wǎng)絡(luò)的監(jiān)控軟件設(shè)計(jì)與實(shí)現(xiàn)11-20

    基于MapObjects控件的鷹眼圖實(shí)現(xiàn)方法03-07