回覆列表
  • 1 # 使用者4912889400776

    #include

    #include

    #include

    #include

    #include

    //定義一些常量;

    //本程式允許的最大臨界區數;

    #define MAX_BUFFER_NUM 10

    //秒到微秒的乘法因子;

    #define INTE_PER_SEC 1000

    //本程式允許的生產和消費執行緒的總數;

    #define MAX_THREAD_NUM 64

    //定義一個結構,記錄在測試檔案中指定的每一個執行緒的引數

    struct ThreadInfo

    {

    int serial; //執行緒序列號

    char entity; //是P還是C

    double delay; //執行緒延遲

    int thread_request[MAX_THREAD_NUM]; //執行緒請求佇列

    int n_request; //請求個數

    };

    //全域性變數的定義

    //臨界區物件的宣告,用於管理緩衝區的互斥訪問;

    CRITICAL_SECTION PC_Critical[MAX_BUFFER_NUM];

    int Buffer_Critical[MAX_BUFFER_NUM]; //緩衝區宣告,用於存放產品;

    HANDLE h_Thread[MAX_THREAD_NUM]; //用於儲存每個執行緒控制代碼的陣列;

    ThreadInfo Thread_Info[MAX_THREAD_NUM]; //執行緒資訊陣列;

    HANDLE empty_semaphore; //一個訊號量;

    HANDLE h_mutex; //一個互斥量;

    DWORD n_Thread = 0; //實際的執行緒的數目;

    DWORD n_Buffer_or_Critical; //實際的緩衝區或者臨界區的數目;

    HANDLE h_Semaphore[MAX_THREAD_NUM]; //生產者允許消費者開始消費的訊號量;

    //生產消費及輔助函式的宣告

    void Produce(void *p);

    void Consume(void *p);

    bool IfInOtherRequest(int);

    int FindProducePositon();

    int FindBufferPosition(int);

    int main(void)

    {

    //宣告所需變數;

    DWORD wait_for_all;

    ifstream inFile;

    //初始化緩衝區;

    for(int i=0;i

    Buffer_Critical[i] = -1;

    //初始化每個執行緒的請求佇列;

    for(int j=0;j

  • 中秋節和大豐收的關聯?
  • 西葫蘆種子什麼品種好?