Tin học
Bạn có muốn phản ứng với tin nhắn này? Vui lòng đăng ký diễn đàn trong một vài cú nhấp chuột hoặc đăng nhập để tiếp tục.

Bài toán Sản xuất - Tiêu thụ (Trong Bài 4 - Quản lí tiến trình) post đây để dễ theo dõi !!!

+9
NguyenAnhNgoc56 (102C)
nguyenvandung(i91C)
nguyenphicuong (i92c)
NguyenThiKimThanh (102C)
NguyenMinhNhuY(102C)
TranVuLam(102C)
dovanbinh (102C)
MaiThePhuong (102C)
NguyenVietHung (102C)
13 posters

Go down

Bài toán Sản xuất - Tiêu thụ (Trong Bài 4 - Quản lí tiến trình) post đây để dễ theo dõi !!! Empty Bài toán Sản xuất - Tiêu thụ (Trong Bài 4 - Quản lí tiến trình) post đây để dễ theo dõi !!!

Bài gửi  NguyenVietHung (102C) 28/3/2011, 00:05


Buổi học hôm 23/3 vừa rồi Thầy có nói bài toán Sản xuất và Tiêu thụ là bài toán khó và quan trọng xuyên suốt môn học Hệ Điều Hành.Có 2 tiến trình là tiến trình Sản Xuất và tiến trình Tiêu Thụ.
Bạn nào hiểu được và phát biểu đầy đủ bài toán này thì post lên cùng tham khảo nhé!
Thứ 4 tuần sau học tiếp nè! Phải tập trung thôi. cyclops


NguyenVietHung (102C)

Tổng số bài gửi : 48
Join date : 21/02/2011

Về Đầu Trang Go down

Bài toán Sản xuất - Tiêu thụ (Trong Bài 4 - Quản lí tiến trình) post đây để dễ theo dõi !!! Empty Re: Bài toán Sản xuất - Tiêu thụ (Trong Bài 4 - Quản lí tiến trình) post đây để dễ theo dõi !!!

Bài gửi  MaiThePhuong (102C) 28/3/2011, 20:31

khó thiệt, phải ráng nghe giảng vào lần tới, rồi lĩnh hội được gì đưa lên cùng mọi người chia sẻ và tìm hiểu thêm
MaiThePhuong (102C)
MaiThePhuong (102C)

Tổng số bài gửi : 80
Join date : 16/02/2011
Age : 34
Đến từ : Bình thuận

Về Đầu Trang Go down

Bài toán Sản xuất - Tiêu thụ (Trong Bài 4 - Quản lí tiến trình) post đây để dễ theo dõi !!! Empty Re: Bài toán Sản xuất - Tiêu thụ (Trong Bài 4 - Quản lí tiến trình) post đây để dễ theo dõi !!!

Bài gửi  dovanbinh (102C) 28/3/2011, 23:26


* Sản xuất chuyên tạo sản phẩm mới và để vào kho chứa.
*Tiêu thụ chuyên lấy sản phẩm từ kho chứa ra để sử dụng.

Bài toán Sản xuất -Tiêu thụ trên có 2 vấn đề cần giải quyết :
*Làm sao để phần tử Sản xuất và Tiêu thụ không được tranh chấp nhau khi truy xuất kho chứa sản phẩm.
*Làm sao để đồng bộ tốc độ thi hành của 2 phần tử để chúng có thể hoạt động tốt theo thời gian, không gây khủng hoảng thừa hay khủng hoảng thiếu.


dovanbinh (102C)
dovanbinh (102C)

Tổng số bài gửi : 139
Join date : 17/02/2011

Về Đầu Trang Go down

Bài toán Sản xuất - Tiêu thụ (Trong Bài 4 - Quản lí tiến trình) post đây để dễ theo dõi !!! Empty Re: Bài toán Sản xuất - Tiêu thụ (Trong Bài 4 - Quản lí tiến trình) post đây để dễ theo dõi !!!

Bài gửi  NguyenVietHung (102C) 30/3/2011, 13:20

MaiThePhuong (102C) đã viết:khó thiệt, phải ráng nghe giảng vào lần tới, rồi lĩnh hội được gì đưa lên cùng mọi người chia sẻ và tìm hiểu thêm

Chúng ta mỗi người hiểu được những gì cùng post lên để hiểu và làm được bài tập này.Nghe nói khó và có trong thi đó bạn! hi hi Embarassed

NguyenVietHung (102C)

Tổng số bài gửi : 48
Join date : 21/02/2011

Về Đầu Trang Go down

Bài toán Sản xuất - Tiêu thụ (Trong Bài 4 - Quản lí tiến trình) post đây để dễ theo dõi !!! Empty Re: Bài toán Sản xuất - Tiêu thụ (Trong Bài 4 - Quản lí tiến trình) post đây để dễ theo dõi !!!

Bài gửi  TranVuLam(102C) 30/3/2011, 22:59

Bài này hình như ở lớp I9C2 có đó,mấy bữa mình vô đó tìm tài liệu nên thấy thì phải
TranVuLam(102C)
TranVuLam(102C)

Tổng số bài gửi : 127
Join date : 16/02/2011

Về Đầu Trang Go down

Bài toán Sản xuất - Tiêu thụ (Trong Bài 4 - Quản lí tiến trình) post đây để dễ theo dõi !!! Empty Re: Bài toán Sản xuất - Tiêu thụ (Trong Bài 4 - Quản lí tiến trình) post đây để dễ theo dõi !!!

Bài gửi  NguyenMinhNhuY(102C) 31/3/2011, 10:24

Sao mình vô tìm hoài không thấy vây ta,cũng đang cần bài này
NguyenMinhNhuY(102C)
NguyenMinhNhuY(102C)

Tổng số bài gửi : 54
Join date : 16/02/2011

Về Đầu Trang Go down

Bài toán Sản xuất - Tiêu thụ (Trong Bài 4 - Quản lí tiến trình) post đây để dễ theo dõi !!! Empty Re: Bài toán Sản xuất - Tiêu thụ (Trong Bài 4 - Quản lí tiến trình) post đây để dễ theo dõi !!!

Bài gửi  NguyenVietHung (102C) 31/3/2011, 16:15

TranVuLam(102C) đã viết:Bài này hình như ở lớp I9C2 có đó,mấy bữa mình vô đó tìm tài liệu nên thấy thì phải
Tối hôm qua đi học nhưng mình vẫn chưa hiểu rõ mấy.bạn nào hiểu rõ post lên để cùng nhau tìm hiểu nha.thanks

NguyenVietHung (102C)

Tổng số bài gửi : 48
Join date : 21/02/2011

Về Đầu Trang Go down

Bài toán Sản xuất - Tiêu thụ (Trong Bài 4 - Quản lí tiến trình) post đây để dễ theo dõi !!! Empty Bài toán Sản xuất - Tiêu thụ

Bài gửi  NguyenThiKimThanh (102C) 1/4/2011, 16:56

Tham khảo code sản xuất và tiêu thụ, các bạn cho ý kiến nha
Code:

#define BUFFER_SIZE  10          //số lượng khoang chứa

int buffer[BUFFER_SIZE];          //bộ nhớ đệm size 10 p.tử
int in=0;                        //con trỏ tới vị trí trống kế tiếp
int out=0;                      //con trỏ tới vị trí trống tiếp theo

int 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();
   }
}

NguyenThiKimThanh (102C)
NguyenThiKimThanh (102C)

Tổng số bài gửi : 46
Join date : 17/02/2011

Về Đầu Trang Go down

Bài toán Sản xuất - Tiêu thụ (Trong Bài 4 - Quản lí tiến trình) post đây để dễ theo dõi !!! Empty Re: Bài toán Sản xuất - Tiêu thụ (Trong Bài 4 - Quản lí tiến trình) post đây để dễ theo dõi !!!

Bài gửi  dovanbinh (102C) 1/4/2011, 17:37

NguyenThiKimThanh (102C) đã viết:Tham khảo code sản xuất và tiêu thụ, các bạn cho ý kiến nha
Code:

#define BUFFER_SIZE  10          //số lượng khoang chứa

int buffer[BUFFER_SIZE];          //bộ nhớ đệm size 10 p.tử
int in=0;                        //con trỏ tới vị trí trống kế tiếp
int out=0;                      //con trỏ tới vị trí trống tiếp theo

int 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 bạn nha!
dovanbinh (102C)
dovanbinh (102C)

Tổng số bài gửi : 139
Join date : 17/02/2011

Về Đầu Trang Go down

Bài toán Sản xuất - Tiêu thụ (Trong Bài 4 - Quản lí tiến trình) post đây để dễ theo dõi !!! Empty Re: Bài toán Sản xuất - Tiêu thụ (Trong Bài 4 - Quản lí tiến trình) post đây để dễ theo dõi !!!

Bài gửi  NguyenVietHung (102C) 1/4/2011, 20:08

NguyenThiKimThanh (102C) đã viết:Tham khảo code sản xuất và tiêu thụ, các bạn cho ý kiến nha
Code:

#define BUFFER_SIZE  10          //số lượng khoang chứa

int buffer[BUFFER_SIZE];          //bộ nhớ đệm size 10 p.tử
int in=0;                        //con trỏ tới vị trí trống kế tiếp
int out=0;                      //con trỏ tới vị trí trống tiếp theo

int 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! code chi tiết lắm.dễ hiểu.

NguyenVietHung (102C)

Tổng số bài gửi : 48
Join date : 21/02/2011

Về Đầu Trang Go down

Bài toán Sản xuất - Tiêu thụ (Trong Bài 4 - Quản lí tiến trình) post đây để dễ theo dõi !!! Empty Re: Bài toán Sản xuất - Tiêu thụ (Trong Bài 4 - Quản lí tiến trình) post đây để dễ theo dõi !!!

Bài gửi  nguyenphicuong (i92c) 2/4/2011, 17:02

NguyenThiKimThanh (102C) đã viết:Tham khảo code sản xuất và tiêu thụ, các bạn cho ý kiến nha
Code:

#define BUFFER_SIZE  10          //số lượng khoang chứa

int buffer[BUFFER_SIZE];          //bộ nhớ đệm size 10 p.tử
int in=0;                        //con trỏ tới vị trí trống kế tiếp
int out=0;                      //con trỏ tới vị trí trống tiếp theo

int 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 ban

nguyenphicuong (i92c)

Tổng số bài gửi : 34
Join date : 16/03/2011

Về Đầu Trang Go down

Bài toán Sản xuất - Tiêu thụ (Trong Bài 4 - Quản lí tiến trình) post đây để dễ theo dõi !!! Empty Re: Bài toán Sản xuất - Tiêu thụ (Trong Bài 4 - Quản lí tiến trình) post đây để dễ theo dõi !!!

Bài gửi  nguyenvandung(i91C) 4/4/2011, 13:28

Cảm ơn bạn

nguyenvandung(i91C)

Tổng số bài gửi : 43
Join date : 06/05/2010

Về Đầu Trang Go down

Bài toán Sản xuất - Tiêu thụ (Trong Bài 4 - Quản lí tiến trình) post đây để dễ theo dõi !!! Empty Re: Bài toán Sản xuất - Tiêu thụ (Trong Bài 4 - Quản lí tiến trình) post đây để dễ theo dõi !!!

Bài gửi  NguyenAnhNgoc56 (102C) 4/4/2011, 16:28

thank bạn, để mình đem code về chạy thử coi

NguyenAnhNgoc56 (102C)

Tổng số bài gửi : 41
Join date : 17/02/2011

Về Đầu Trang Go down

Bài toán Sản xuất - Tiêu thụ (Trong Bài 4 - Quản lí tiến trình) post đây để dễ theo dõi !!! Empty Phát biểu bài toán sản xuất tiêu thụ với thuật giải phù hợp. Trình bày giải thuật

Bài gửi  dovanbinh (102C) 4/4/2011, 16:57


Phát biểu bài toán:
• Giả sử có Bộ nhớ đệm (Buffer) bao gồm nhiều khoang (Items) được tiến trình Producer lần lượt đưa các sản phẩm S1, S2,... vào.
• Tiến trình Consumer lần lượt lấy sản phẩm ra theo đúng thứ tự.
• Công việc của Producer phải đồng bộ với Consumer: Không được đưa sản phẩm vào khi Buffer đầy, Không được lấy ra khi chưa có.

Trình bày giải thuật:


Bài toán Sản xuất - Tiêu thụ (Trong Bài 4 - Quản lí tiến trình) post đây để dễ theo dõi !!! 54744433
dovanbinh (102C)
dovanbinh (102C)

Tổng số bài gửi : 139
Join date : 17/02/2011

Về Đầu Trang Go down

Bài toán Sản xuất - Tiêu thụ (Trong Bài 4 - Quản lí tiến trình) post đây để dễ theo dõi !!! Empty Re: Bài toán Sản xuất - Tiêu thụ (Trong Bài 4 - Quản lí tiến trình) post đây để dễ theo dõi !!!

Bài gửi  QuachVanLoc_I92C 4/4/2011, 17:10

Thanks các bạn nha.

QuachVanLoc_I92C

Tổng số bài gửi : 64
Join date : 23/09/2010

Về Đầu Trang Go down

Bài toán Sản xuất - Tiêu thụ (Trong Bài 4 - Quản lí tiến trình) post đây để dễ theo dõi !!! Empty Re: Bài toán Sản xuất - Tiêu thụ (Trong Bài 4 - Quản lí tiến trình) post đây để dễ theo dõi !!!

Bài gửi  NGUYENVANMANH(102C) 5/4/2011, 13:34

NguyenThiKimThanh (102C) đã viết:Tham khảo code sản xuất và tiêu thụ, các bạn cho ý kiến nha
Code:

#define BUFFER_SIZE  10          //số lượng khoang chứa

int buffer[BUFFER_SIZE];          //bộ nhớ đệm size 10 p.tử
int in=0;                        //con trỏ tới vị trí trống kế tiếp
int out=0;                      //con trỏ tới vị trí trống tiếp theo

int 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();
   }
}


Thank bạn nhiều. để mình chạy thử rồi debug mới hiểu được.

NGUYENVANMANH(102C)

Tổng số bài gửi : 68
Join date : 23/02/2011

Về Đầu Trang Go down

Bài toán Sản xuất - Tiêu thụ (Trong Bài 4 - Quản lí tiến trình) post đây để dễ theo dõi !!! Empty Re: Bài toán Sản xuất - Tiêu thụ (Trong Bài 4 - Quản lí tiến trình) post đây để dễ theo dõi !!!

Bài gửi  NguyenVietHung (102C) 5/4/2011, 14:23

NGUYENVANMANH(102C) đã viết:
NguyenThiKimThanh (102C) đã viết:Tham khảo code sản xuất và tiêu thụ, các bạn cho ý kiến nha
Code:

#define BUFFER_SIZE  10          //số lượng khoang chứa

int buffer[BUFFER_SIZE];          //bộ nhớ đệm size 10 p.tử
int in=0;                        //con trỏ tới vị trí trống kế tiếp
int out=0;                      //con trỏ tới vị trí trống tiếp theo

int 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();
   }
}


Thank bạn nhiều. để mình chạy thử rồi debug mới hiểu được.

Bạn chụp hình từng bước cho mọi người cùng xem luôn nhé! Cám ơn bạn đã đóng góp.

NguyenVietHung (102C)

Tổng số bài gửi : 48
Join date : 21/02/2011

Về Đầu Trang Go down

Bài toán Sản xuất - Tiêu thụ (Trong Bài 4 - Quản lí tiến trình) post đây để dễ theo dõi !!! Empty Bài toán Sản xuất - Tiêu thụ (Trong Bài 4 - Quản lí tiến trình) post đây để dễ theo dõi !!!

Bài gửi  TranDinhHuan (102C) 5/4/2011, 16:20

Thank ban nhiu ha!
TranDinhHuan (102C)
TranDinhHuan (102C)

Tổng số bài gửi : 34
Join date : 17/02/2011
Age : 35

Về Đầu Trang Go down

Bài toán Sản xuất - Tiêu thụ (Trong Bài 4 - Quản lí tiến trình) post đây để dễ theo dõi !!! Empty Re: Bài toán Sản xuất - Tiêu thụ (Trong Bài 4 - Quản lí tiến trình) post đây để dễ theo dõi !!!

Bài gửi  nguyenthingoan (i92c) 8/4/2011, 16:53

Bài code này của bạn đúng chuẩn luôn. Cảm ơn bạn nhiều nhé vì còn giải thích code rõ ràng nữa.

nguyenthingoan (i92c)

Tổng số bài gửi : 39
Join date : 16/02/2011

Về Đầu Trang Go down

Bài toán Sản xuất - Tiêu thụ (Trong Bài 4 - Quản lí tiến trình) post đây để dễ theo dõi !!! Empty Re: Bài toán Sản xuất - Tiêu thụ (Trong Bài 4 - Quản lí tiến trình) post đây để dễ theo dõi !!!

Bài gửi  Sponsored content


Sponsored content


Về Đầu Trang Go down

Về Đầu Trang

- Similar topics

 
Permissions in this forum:
Bạn không có quyền trả lời bài viết