Ứng dụng Bài toán SX-TT 2 đèn hiệu để tạo ra 50 luồng sản xuất, tiêu thụ thực thi tự động
+8
NguyenThiHang
ITPRO
nvhung_107H1040
vancoi
lqhlam
hugo
10761253_tuenhan
ngoanhtuan
12 posters
Trang 1 trong tổng số 1 trang
Ứng dụng Bài toán SX-TT 2 đèn hiệu để tạo ra 50 luồng sản xuất, tiêu thụ thực thi tự động
Hi mọi người,
Trong buổi thực hành tối thứ 7 ngày 9/5/2009 dựa và hướng dẫn của thầy mình có làm bài SX-TT 2 đèn hiệu để tạo ra 50 nhà sản xuất, tiêu thụ thực thi một cách tự động. Kính mong Thầy, cũng như các bạn tham khảo và đóng góp ý kiến cho mình.
Cảm ơn các bạn.
//==Begin==
#include "stdafx.h"
#include <stdio.h>
#include <conio.h>
#include <windows.h>
#define BUFFER_SIZE 10
int buffer[BUFFER_SIZE];
char s[BUFFER_SIZE];
int in=0;
int out=0;
int nextProduced=1;
HANDLE semEmpty, semFull; // Hai den hieu
CRITICAL_SECTION critSec; // Bien kieu Mutex
void Producer(void * p){
while (1){
// ... San xuat (nextProduced)
// Cho den khi co cho trong
WaitForSingleObject(semEmpty, INFINITE);
EnterCriticalSection(&critSec);
buffer[in]=nextProduced++;
switch ((int)p){
case 1:
s[in]='P';
break;
case 2:
s[in]='p';
break;
default:
s[in]='S';
};
in=(in+1)%BUFFER_SIZE;
// Tang (semFull) len 1
ReleaseSemaphore(semFull, 1, NULL);
LeaveCriticalSection(&critSec);
Sleep(1000);
//SuspendThread(GetCurrentThread());
}
}
void Consumer(){
int nextConsumed;
while (1){
// Cho den khi co san pham
WaitForSingleObject(semFull, INFINITE);
EnterCriticalSection(&critSec);
nextConsumed=buffer[out];
out=(out+1)%BUFFER_SIZE;
// Tang (semEmpty) len 1
ReleaseSemaphore (semEmpty, 1, NULL);
LeaveCriticalSection(&critSec);
Sleep(1000);
}
}
void ShowBuffer(){ // In noi dung bo dem
const char * LeftMargin="\n ";
int i;
printf(LeftMargin);
for(i=0; i<(in*5); i++) putchar(' '); printf("!in");
printf(LeftMargin);
for (i=0; i<BUFFER_SIZE-1; i++)
printf("%c%2d, ", s[i], buffer[i]);
printf("%c%2d", s[BUFFER_SIZE-1], buffer[BUFFER_SIZE-1]);
printf(LeftMargin);
for(i=0; i<(out*5); i++) putchar(' ');
printf("^out");
printf("\n");
}
int main(){
HANDLE ProducerHandle[50];
HANDLE ConsumerHandle[50];
DWORD ProducerID[50];
DWORD ConsumerID[50];
semEmpty=CreateSemaphore(0, BUFFER_SIZE, BUFFER_SIZE, 0);
semFull=CreateSemaphore(0, 0, BUFFER_SIZE, 0);
InitializeCriticalSection(&critSec);
// tao 50 luong san xuat trong trang thai tu dong
for(int i=0; i < 50; i++)
{
ProducerHandle[i] = CreateThread(0,0,
(LPTHREAD_START_ROUTINE)Producer, (void *)(i+1), 0, &ProducerID[i]);
}
// tao 50 luong tieu thu trong trang thai tu dong
for(int j=0; j < 50; j++)
{
ConsumerHandle[j]=CreateThread(0,0,
(LPTHREAD_START_ROUTINE)Consumer, 0, 0, &ConsumerID[j]);
}
while(1)
{
EnterCriticalSection(&critSec);
Sleep(2000);
ShowBuffer();
LeaveCriticalSection(&critSec);
}
}
//==End==
Trong buổi thực hành tối thứ 7 ngày 9/5/2009 dựa và hướng dẫn của thầy mình có làm bài SX-TT 2 đèn hiệu để tạo ra 50 nhà sản xuất, tiêu thụ thực thi một cách tự động. Kính mong Thầy, cũng như các bạn tham khảo và đóng góp ý kiến cho mình.
Cảm ơn các bạn.
//==Begin==
#include "stdafx.h"
#include <stdio.h>
#include <conio.h>
#include <windows.h>
#define BUFFER_SIZE 10
int buffer[BUFFER_SIZE];
char s[BUFFER_SIZE];
int in=0;
int out=0;
int nextProduced=1;
HANDLE semEmpty, semFull; // Hai den hieu
CRITICAL_SECTION critSec; // Bien kieu Mutex
void Producer(void * p){
while (1){
// ... San xuat (nextProduced)
// Cho den khi co cho trong
WaitForSingleObject(semEmpty, INFINITE);
EnterCriticalSection(&critSec);
buffer[in]=nextProduced++;
switch ((int)p){
case 1:
s[in]='P';
break;
case 2:
s[in]='p';
break;
default:
s[in]='S';
};
in=(in+1)%BUFFER_SIZE;
// Tang (semFull) len 1
ReleaseSemaphore(semFull, 1, NULL);
LeaveCriticalSection(&critSec);
Sleep(1000);
//SuspendThread(GetCurrentThread());
}
}
void Consumer(){
int nextConsumed;
while (1){
// Cho den khi co san pham
WaitForSingleObject(semFull, INFINITE);
EnterCriticalSection(&critSec);
nextConsumed=buffer[out];
out=(out+1)%BUFFER_SIZE;
// Tang (semEmpty) len 1
ReleaseSemaphore (semEmpty, 1, NULL);
LeaveCriticalSection(&critSec);
Sleep(1000);
}
}
void ShowBuffer(){ // In noi dung bo dem
const char * LeftMargin="\n ";
int i;
printf(LeftMargin);
for(i=0; i<(in*5); i++) putchar(' '); printf("!in");
printf(LeftMargin);
for (i=0; i<BUFFER_SIZE-1; i++)
printf("%c%2d, ", s[i], buffer[i]);
printf("%c%2d", s[BUFFER_SIZE-1], buffer[BUFFER_SIZE-1]);
printf(LeftMargin);
for(i=0; i<(out*5); i++) putchar(' ');
printf("^out");
printf("\n");
}
int main(){
HANDLE ProducerHandle[50];
HANDLE ConsumerHandle[50];
DWORD ProducerID[50];
DWORD ConsumerID[50];
semEmpty=CreateSemaphore(0, BUFFER_SIZE, BUFFER_SIZE, 0);
semFull=CreateSemaphore(0, 0, BUFFER_SIZE, 0);
InitializeCriticalSection(&critSec);
// tao 50 luong san xuat trong trang thai tu dong
for(int i=0; i < 50; i++)
{
ProducerHandle[i] = CreateThread(0,0,
(LPTHREAD_START_ROUTINE)Producer, (void *)(i+1), 0, &ProducerID[i]);
}
// tao 50 luong tieu thu trong trang thai tu dong
for(int j=0; j < 50; j++)
{
ConsumerHandle[j]=CreateThread(0,0,
(LPTHREAD_START_ROUTINE)Consumer, 0, 0, &ConsumerID[j]);
}
while(1)
{
EnterCriticalSection(&critSec);
Sleep(2000);
ShowBuffer();
LeaveCriticalSection(&critSec);
}
}
//==End==
ngoanhtuan- Tổng số bài gửi : 14
Join date : 08/05/2009
Re: Ứng dụng Bài toán SX-TT 2 đèn hiệu để tạo ra 50 luồng sản xuất, tiêu thụ thực thi tự động
theo e thay thi baii nay bi lap vo han thi fai.em nghi minh nen dua zo dieu kien dung cho no.
10761253_tuenhan- Tổng số bài gửi : 10
Join date : 09/05/2009
Age : 35
Re: Ứng dụng Bài toán SX-TT 2 đèn hiệu để tạo ra 50 luồng sản xuất, tiêu thụ thực thi tự động
Hi đồng chí 10761253_tuenhan,
Đã gọi là thực thi tự động rồi, thì nó chỉ dừng lại khi you đóng chương trình thôi chứ còn gì nữa.
Thanks&Regards
Tuấn
Đã gọi là thực thi tự động rồi, thì nó chỉ dừng lại khi you đóng chương trình thôi chứ còn gì nữa.
Thanks&Regards
Tuấn
ngoanhtuan- Tổng số bài gửi : 14
Join date : 08/05/2009
Re: Ứng dụng Bài toán SX-TT 2 đèn hiệu để tạo ra 50 luồng sản xuất, tiêu thụ thực thi tự động
Thanks ban nha!
De ve minh chay thu xem the nao...trua gio lam no ma hok ra!
De ve minh chay thu xem the nao...trua gio lam no ma hok ra!
hugo- Tổng số bài gửi : 15
Join date : 26/02/2009
Re: Ứng dụng Bài toán SX-TT 2 đèn hiệu để tạo ra 50 luồng sản xuất, tiêu thụ thực thi tự động
Thật ngưỡng mộ quá đi. Vậy bạn tốt bụng có thể giải thích được những dòng lệnh đó ko?
lqhlam- Tổng số bài gửi : 90
Join date : 17/03/2009
Thanks
Ban oi!!!!!!!! 2 vong for i va j lap 50 lần mình có thể gộp chung cho gọn k hông??????????
vancoi- Tổng số bài gửi : 45
Join date : 01/05/2009
Re: Ứng dụng Bài toán SX-TT 2 đèn hiệu để tạo ra 50 luồng sản xuất, tiêu thụ thực thi tự động
cám ơn bạn đã gửi code cho mọi người. Mình đang bí mà bạn lại cho mình cái phao rồi . Dựa theo code này chúng ta có thể làm được rất nhiều bài toán khác. 1 lần nữa xin cảm ơn bạn rất nhiều.
nvhung_107H1040- Tổng số bài gửi : 136
Join date : 04/03/2009
Re: Ứng dụng Bài toán SX-TT 2 đèn hiệu để tạo ra 50 luồng sản xuất, tiêu thụ thực thi tự động
Xin góp ý một xíu với các bạn:
Trường hợp gộp 2 vòng for lại với nhau thì không sai, nhưng sản xuất được bao nhieu thì tiêu thụ liền bấy nhiêu. Còn nếu 2 vòng for riêng biệt thì sản xuất được 50 rồi mới tiêu thụ hết 50 luôn.
Trường hợp gộp 2 vòng for lại với nhau thì không sai, nhưng sản xuất được bao nhieu thì tiêu thụ liền bấy nhiêu. Còn nếu 2 vòng for riêng biệt thì sản xuất được 50 rồi mới tiêu thụ hết 50 luôn.
ITPRO- Tổng số bài gửi : 73
Join date : 19/02/2009
Age : 46
Ứng dụng Bài toán SX-TT 2 đèn hiệu để tạo ra 50 luồng sản xuất, tiêu thụ thực thi tự động
Bạn ứng dụng bài toán SX-TT 2 đèn hiệu để tạo ra 50 luồng sản xuất, tiêu thụ để thực thi tự động. Nếu trong trường hợp có 1000 luồng sản xuất, tiêu thụ thì sau. Nếu dùng cách trên phải sửa lại dòng code. Sau bạn không dùng biến định nghĩa. Đoạn code sẽ tối ưu nếu có n luồng sản xuất, tiêu thu.
Bạn xem ý tưởng này nha
#include "stdafx.h"
#include <stdio.h>
#include <conio.h>
#include <windows.h>
#define BUFFER_SIZE 10
#define P 1000 // 1000 luồng sản xuất
#define C 1000 // 1000 luồng tiêu thụ
..................
..................
int main(){
HANDLE ProducerHandle[P];
HANDLE ConsumerHandle[C];
DWORD ProducerID[P];
DWORD ConsumerID[C];
semEmpty=CreateSemaphore(0, BUFFER_SIZE, BUFFER_SIZE, 0);
semFull=CreateSemaphore(0, 0, BUFFER_SIZE, 0);
InitializeCriticalSection(&critSec);
// tao P luong san xuat trong trang thai tu dong
for(int i=0; i < P; i++){
ProducerHandle[i] = CreateThread(0,0,
(LPTHREAD_START_ROUTINE)Producer, (void *)(i+1), 0, &ProducerID[i]);
}
// tao C luong tieu thu trong trang thai tu dong
for(int j=0; j < C; j++){
ConsumerHandle[j]=CreateThread(0,0,
(LPTHREAD_START_ROUTINE)Consumer, 0, 0, &ConsumerID[j]);
}
while(1){
EnterCriticalSection(&critSec);
Sleep(1000);
ShowBuffer();
LeaveCriticalSection(&critSec);
}
}
Các bạn thử xem sau. Mình thấy tối ưu hơn.
Bạn xem ý tưởng này nha
#include "stdafx.h"
#include <stdio.h>
#include <conio.h>
#include <windows.h>
#define BUFFER_SIZE 10
#define P 1000 // 1000 luồng sản xuất
#define C 1000 // 1000 luồng tiêu thụ
..................
..................
int main(){
HANDLE ProducerHandle[P];
HANDLE ConsumerHandle[C];
DWORD ProducerID[P];
DWORD ConsumerID[C];
semEmpty=CreateSemaphore(0, BUFFER_SIZE, BUFFER_SIZE, 0);
semFull=CreateSemaphore(0, 0, BUFFER_SIZE, 0);
InitializeCriticalSection(&critSec);
// tao P luong san xuat trong trang thai tu dong
for(int i=0; i < P; i++){
ProducerHandle[i] = CreateThread(0,0,
(LPTHREAD_START_ROUTINE)Producer, (void *)(i+1), 0, &ProducerID[i]);
}
// tao C luong tieu thu trong trang thai tu dong
for(int j=0; j < C; j++){
ConsumerHandle[j]=CreateThread(0,0,
(LPTHREAD_START_ROUTINE)Consumer, 0, 0, &ConsumerID[j]);
}
while(1){
EnterCriticalSection(&critSec);
Sleep(1000);
ShowBuffer();
LeaveCriticalSection(&critSec);
}
}
Các bạn thử xem sau. Mình thấy tối ưu hơn.
Ứng dụng Bài toán SX-TT 2 đèn hiệu để tạo ra 50 luồng sản xuất, tiêu thụ thực thi tự động
NguyenThiHang đã viết:Bạn ứng dụng bài toán SX-TT 2 đèn hiệu để tạo ra 50 luồng sản xuất, tiêu thụ để thực thi tự động. Nếu trong trường hợp có 1000 luồng sản xuất, tiêu thụ thì sau. Nếu dùng cách trên phải sửa lại dòng code. Sau bạn không dùng biến định nghĩa. Đoạn code sẽ tối ưu nếu có n luồng sản xuất, tiêu thu.
Bạn xem ý tưởng này nha
#include "stdafx.h"
#include <stdio.h>
#include <conio.h>
#include <windows.h>
#define BUFFER_SIZE 10
#define P 1000 // 1000 luồng sản xuất
#define C 1000 // 1000 luồng tiêu thụ
..................
..................
int main(){
HANDLE ProducerHandle[P];
HANDLE ConsumerHandle[C];
DWORD ProducerID[P];
DWORD ConsumerID[C];
semEmpty=CreateSemaphore(0, BUFFER_SIZE, BUFFER_SIZE, 0);
semFull=CreateSemaphore(0, 0, BUFFER_SIZE, 0);
InitializeCriticalSection(&critSec);
// tao P luong san xuat trong trang thai tu dong
for(int i=0; i < P; i++){
ProducerHandle[i] = CreateThread(0,0,
(LPTHREAD_START_ROUTINE)Producer, (void *)(i+1), 0, &ProducerID[i]);
}
// tao C luong tieu thu trong trang thai tu dong
for(int j=0; j < C; j++){
ConsumerHandle[j]=CreateThread(0,0,
(LPTHREAD_START_ROUTINE)Consumer, 0, 0, &ConsumerID[j]);
}
while(1){
EnterCriticalSection(&critSec);
Sleep(1000);
ShowBuffer();
LeaveCriticalSection(&critSec);
}
}
Các bạn thử xem sau. Mình thấy tối ưu hơn.
Gọn hơn thôi, chứ thật chất cũng giống nhau thôi
nguyenthiphuongchi- Tổng số bài gửi : 57
Join date : 24/02/2009
Re: Ứng dụng Bài toán SX-TT 2 đèn hiệu để tạo ra 50 luồng sản xuất, tiêu thụ thực thi tự động
Mình cũng thấy gọn hơn nhưng chưa biết có tối ưu hơn k. Trông thì cũng giống nhau đấy!nguyenthiphuongchi đã viết:NguyenThiHang đã viết:Bạn ứng dụng bài toán SX-TT 2 đèn hiệu để tạo ra 50 luồng sản xuất, tiêu thụ để thực thi tự động. Nếu trong trường hợp có 1000 luồng sản xuất, tiêu thụ thì sau. Nếu dùng cách trên phải sửa lại dòng code. Sau bạn không dùng biến định nghĩa. Đoạn code sẽ tối ưu nếu có n luồng sản xuất, tiêu thu.
Bạn xem ý tưởng này nha
#include "stdafx.h"
#include <stdio.h>
#include <conio.h>
#include <windows.h>
#define BUFFER_SIZE 10
#define P 1000 // 1000 luồng sản xuất
#define C 1000 // 1000 luồng tiêu thụ
..................
..................
int main(){
HANDLE ProducerHandle[P];
HANDLE ConsumerHandle[C];
DWORD ProducerID[P];
DWORD ConsumerID[C];
semEmpty=CreateSemaphore(0, BUFFER_SIZE, BUFFER_SIZE, 0);
semFull=CreateSemaphore(0, 0, BUFFER_SIZE, 0);
InitializeCriticalSection(&critSec);
// tao P luong san xuat trong trang thai tu dong
for(int i=0; i < P; i++){
ProducerHandle[i] = CreateThread(0,0,
(LPTHREAD_START_ROUTINE)Producer, (void *)(i+1), 0, &ProducerID[i]);
}
// tao C luong tieu thu trong trang thai tu dong
for(int j=0; j < C; j++){
ConsumerHandle[j]=CreateThread(0,0,
(LPTHREAD_START_ROUTINE)Consumer, 0, 0, &ConsumerID[j]);
}
while(1){
EnterCriticalSection(&critSec);
Sleep(1000);
ShowBuffer();
LeaveCriticalSection(&critSec);
}
}
Các bạn thử xem sau. Mình thấy tối ưu hơn.
Gọn hơn thôi, chứ thật chất cũng giống nhau thôi
Lethanhtruc- Tổng số bài gửi : 64
Join date : 24/03/2009
Re: Ứng dụng Bài toán SX-TT 2 đèn hiệu để tạo ra 50 luồng sản xuất, tiêu thụ thực thi tự động
Minh thay code cua ban Hang hay day chu!Chuc ban thi tot
NguyenTheNam- Tổng số bài gửi : 31
Join date : 21/02/2009
Re: Ứng dụng Bài toán SX-TT 2 đèn hiệu để tạo ra 50 luồng sản xuất, tiêu thụ thực thi tự động
_ Có 1 nguyên tắc trong lập trình, đó là nên sử dụng hằng số đối với những giá trị nào có thể cần thay đổi trong tương lai (nâng cấp hay phát triển phần mềm). Vì thế bạn Hằng đưa ra ý kiến như vậy mình cho là rất chính xác, đây là nguyên tắc cơ bản trong lập trình mà, không lẽ các bạn quên hết rồi sao?NguyenThiHang đã viết:Bạn ứng dụng bài toán SX-TT 2 đèn hiệu để tạo ra 50 luồng sản xuất, tiêu thụ để thực thi tự động. Nếu trong trường hợp có 1000 luồng sản xuất, tiêu thụ thì sau. Nếu dùng cách trên phải sửa lại dòng code. Sau bạn không dùng biến định nghĩa. Đoạn code sẽ tối ưu nếu có n luồng sản xuất, tiêu thu.
Bạn xem ý tưởng này nha
#include "stdafx.h"
#include <stdio.h>
#include <conio.h>
#include <windows.h>
#define BUFFER_SIZE 10
#define P 1000 // 1000 luồng sản xuất
#define C 1000 // 1000 luồng tiêu thụ
Các bạn thử xem sau. Mình thấy tối ưu hơn.
_ Nhắc bạn Hằng một chút : không phải là dùng biến định nghĩa mà là dùng Hằng số (constant).
_ Chào & chúc các bạn thi tốt chiều nay!
asmking- Tổng số bài gửi : 137
Join date : 19/03/2009
Similar topics
» Thực thi bài toán sản xuất, tiêu thụ được đồng bộ bằng 2 đèn hiệu ?
» Thảo luận Bài 7
» Thảo luận Bài 7
» Thảo luận Bài 7
» Ôn tập thi Cuối kỳ
» Thảo luận Bài 7
» Thảo luận Bài 7
» Thảo luận Bài 7
» Ôn tập thi Cuối kỳ
Trang 1 trong tổng số 1 trang
Permissions in this forum:
Bạn không có quyền trả lời bài viết