Thảo Luận Bài 4 - Page 3 - Hệ điều Hành

Thảo luận Bài 4 - Page 3 Empty Re: Thảo luận Bài 4

Bài gửi NguyenChiKien(HLT3) 30/3/2014, 09:06

NguyenThiKimThanh (102C) đã viết:Tham khảo code sản xuất và tiêu thụ, các bạn cho ý kiến nhaCode:#define BUFFER_SIZE  10          //số lượng khoang chứaint buffer[BUFFER_SIZE];          //bộ nhớ đệm size 10 p.tử int in=0;                        //con trỏ tới vị trí trống kế tiếpint out=0;                      //con trỏ tới vị trí trống tiếp theoint nextProduced=1;    //tạo 1 sản phẩm được sản xuất kế tiếp//Hàm sản xuất:void Producer(){   while (1)   {      //Quá trình tạo ra 1 sản phẩm      // ... San xuat (nextProduced      //vòng lặp quẩn tại đây cho đến khi có 1 chỗ trống trong bộ đệm hay ngăn chứa sản phẩm      while(((in+1)%BUFFER_SIZE)==out);      //khi vòng lặp while kết thúc =>có 1 chỗ trống để chèn sản phẩm vào      buffer[in]=nextProduced++;      //chèn sản phẩm tại vị trí in vô ngăn chứa, sản phẩm được sản xuất      in=(in+1)%BUFFER_SIZE;       //tìm vị trí khác để Producer chèn thêm sản phầm vào      //hàm SuspendThread dùng để tạo ngưng 1 luồng hiện hành      SuspendThread(GetCurrentThread());   }}//Hàm tiêu thụ:void Consumer(){   int nextConsumed;   while (1)   {      // vòng lặp quẩn tại đây khi các ngăn chứa sản phầm đều trống      while(in==out);      //vòng lặp while thoát khi có 1 ngăn chứa sản phầm      nextConsumed=buffer[out];   //lấy sản phẩm tại vị trí out ra khỏi ngăn      out=(out+1)%BUFFER_SIZE;   //tìm vị trí khác để Consumer lấy sản phẩm      // ... Tieu thu (nextConsumed)--> quá trình tiêu thụ sàn phẩm      //hàm Sleep đưa luồng vào trạng thái ngủ trong khi chờ Producer sản xuất thêm sản phầm      //đếm số mili giây trong giờ hiện tại % 5000, hết thời gian thực hiện while kế tiếp      Sleep(GetTickCount()%5000);   }}int main(){   HANDLE ProducerHandle1, ProducerHandle2;//biến HANDLE chứa mục quản nhà sản xuất   HANDLE ConsumerHandle1, ConsumerHandle2;// biến HANDLE chứa mục quản nhà tiêu thụ   DWORD ProducerID1, ProducerID2, ConsumerID1, ConsumerID2;//chứa ID nhà sản xuất và nhà tiêu thụ     //khởi tạo nhà sản xuất với các thông tin: Producer, ID, số 4 biểu thị trạng thái của Producer lúc khởi tạo: trạng thái ngủ   ProducerHandle1=CreateThread(0,0,(LPTHREAD_START_ROUTINE)Producer,0,4,&ProducerID1);   ProducerHandle2=CreateThread(0,0,(LPTHREAD_START_ROUTINE)Producer,0,4,&ProducerID2);   //khởi tạo nhà tiêu thụ với các thông tin: Consumer, ID, số 0 biểu thị trạng thái của Producer lúc khởi tạo: trạng thái thức   ConsumerHandle1=CreateThread(0,0,(LPTHREAD_START_ROUTINE)Consumer,0,0,&ConsumerID1);   ConsumerHandle2=CreateThread(0,0,(LPTHREAD_START_ROUTINE)Consumer,0,0,&ConsumerID2);   while(1)   {      printf("\n- Nhan phim P/p de san xuat, nhan 0 de ket thuc:");      switch (getch())      {         //nhấn phím P=Producing         case 'P':               // đánh thức Producer lúc này đang ở trạng thái ngủ               ResumeThread(ProducerHandle1);            break;         //nhấn phím p=Producing         case 'p':   ResumeThread(ProducerHandle2);      break;         //giải phóng Producer và Consumer khỏi bộ nhớ         case '0':         {            CloseHandle(ProducerHandle1);            CloseHandle(ProducerHandle2);            CloseHandle(ConsumerHandle1);            CloseHandle(ConsumerHandle2);            return 0;         }      }      //ngừng 1 khoảng thời gian nhất định để nhà sản xuất vừa được đánh thức kịp hoàn tất 1 chu trình công việc      Sleep(1);      //show kết quả sau khi sản xuất tiêu thụ      ShowBuffer();   }}
Thanks... Rõ ràng!!!!

Từ khóa » Khi Lời Gọi Sleep() được Gọi Bởi Tiến Trình P1 Thì Tiến Trình P1 Sẽ Chuyển Tới Trạng Thái Nào