CODE BÀI TẬP VỀ SẢN XUẤT - TIÊU THỤ
+2
luonghuytai(I92C)
kimgiap(i92c)
6 posters
Trang 1 trong tổng số 1 trang
CODE BÀI TẬP VỀ SẢN XUẤT - TIÊU THỤ
Tạo 100 luồng sản xuất ở trạng thái Suspend
for(int i=0;i<100;i++)
{
Handle ProducerHandle[i];
DWORD ProducerID[i];
ProducerHandle[i]=CreateThread(0,0(LPTHREAD_START_ROUTINE)Producer,(void *)i,4,&ProducerID[i]);
}
Tạo 50 luồng các nhà tiêu thụ ở trạng thái supend
for(int i=0;i<50;i++)
{
Handle ConsumerHandle[i];
DWORD ConsumerID[i];
ConsumerHandle[i]=CreateThread(0,0(LPTHREAD_START_ROUTINE)Consumer,0,4,&ConsumerID[i];
}
Các bạn và ACE tham gia thảo luận nhé!
Admin
- Về cơ bản đúng.
- Cần đưa 2 dòng khai báo biến mảng ra khỏi vòng lặp và chỉ rõ số phần tử cho chúng (dùng i là sai).
- Chú ý sửa "Handle" thành "HANDLE" cho đúng, vì C "kén" chữ hoa-chữ thường !
for(int i=0;i<100;i++)
{
Handle ProducerHandle[i];
DWORD ProducerID[i];
ProducerHandle[i]=CreateThread(0,0(LPTHREAD_START_ROUTINE)Producer,(void *)i,4,&ProducerID[i]);
}
Tạo 50 luồng các nhà tiêu thụ ở trạng thái supend
for(int i=0;i<50;i++)
{
Handle ConsumerHandle[i];
DWORD ConsumerID[i];
ConsumerHandle[i]=CreateThread(0,0(LPTHREAD_START_ROUTINE)Consumer,0,4,&ConsumerID[i];
}
Các bạn và ACE tham gia thảo luận nhé!
Admin
- Về cơ bản đúng.
- Cần đưa 2 dòng khai báo biến mảng ra khỏi vòng lặp và chỉ rõ số phần tử cho chúng (dùng i là sai).
- Chú ý sửa "Handle" thành "HANDLE" cho đúng, vì C "kén" chữ hoa-chữ thường !
kimgiap(i92c)- Tổng số bài gửi : 144
Join date : 28/07/2010
Đến từ : Bình Định
Re: CODE BÀI TẬP VỀ SẢN XUẤT - TIÊU THỤ
kimgiap(i92c) đã viết:Tạo 100 luồng sản xuất ở trạng thái supend
for(int i=0;i<100;i++)
{
Handle ProducerHandle[i];
DWORD ProducerID[i];
ProducerHandle[i]=CreateThread(0,0(LPTHREAD_START_ROUTINE)Producer,(void *)i,4,&ProducerID[i]);
}
Tạo 50 luồng các nhà tiêu thụ ở trạng thái supend
for(int i=0;i<50;i++)
{
Handle ConsumerHandle[i];
DWORD ConsumerID[i];
ConsumerHandle[i]=CreateThread(0,0(LPTHREAD_START_ROUTINE)Consumer,0,4,&ConsumerID[i];
}
Các bạn và ACE tham gia thảo luận nhé!
ông này nhanh tay nhỉ ! >_<. Vậy sẳn đây hỏi luôn ! Main() trong luồng chính phải bắt P và p trong để chạy 2 luồng sản xuất. Nhưng theo cách trên thì 100 luồng nhà sản xuất và 50 luồng tiêu thụ... ông chia thế nào !
luonghuytai(I92C)- Tổng số bài gửi : 78
Join date : 13/09/2010
Re: CODE BÀI TẬP VỀ SẢN XUẤT - TIÊU THỤ
Học bài tiếp theo chúng ta sẽ thấy cách chia đó.Ông hãy đợi đó Câu trả lời sẻ đến với ông sớm nhất thui.
kimgiap(i92c)- Tổng số bài gửi : 144
Join date : 28/07/2010
Đến từ : Bình Định
Re: CODE BÀI TẬP VỀ SẢN XUẤT - TIÊU THỤ
Nhờ thầy và các bạn giải thích dùm mình (void*)i trong hàm CreateThread của ProducerHandle.
ngocdangI83C- Tổng số bài gửi : 85
Join date : 04/10/2010
Re: CODE BÀI TẬP VỀ SẢN XUẤT - TIÊU THỤ
Giả sử ở trường hợp đơn giản có 2 consumer, 1 producer thôi. Việc tạo ra SP thì chậm hơn so với việc tiêu thụ. Lúc nào 2 consumer cũng ở chế độ busy-waiting để đợi tiêu thụ hàng.
Không biết có trường hợp khi 1 SP vừa được tạo ra thì cả 2 consumer cùng lúc đem đi tiêu thụ không nhỉ. Như vậy có thể xảy ra tranh chấp tài nguyên, đưa ra kết quả không đúng.
Nếu có 1 cơ chế random chọn consumer để tiêu thụ thì không biết có trường hợp nó random về hẳn 1 bên không nhỉ (nghĩa là có 1 consumer cứ thực hiện việc tiêu thụ liên tục, còn consumer còn lại thì cứ ở mãi chế độ busy-waiting).
Không biết có trường hợp khi 1 SP vừa được tạo ra thì cả 2 consumer cùng lúc đem đi tiêu thụ không nhỉ. Như vậy có thể xảy ra tranh chấp tài nguyên, đưa ra kết quả không đúng.
Nếu có 1 cơ chế random chọn consumer để tiêu thụ thì không biết có trường hợp nó random về hẳn 1 bên không nhỉ (nghĩa là có 1 consumer cứ thực hiện việc tiêu thụ liên tục, còn consumer còn lại thì cứ ở mãi chế độ busy-waiting).
DinhTranHoangQuan_I92C- Tổng số bài gửi : 23
Join date : 25/10/2010
Re: CODE BÀI TẬP VỀ SẢN XUẤT - TIÊU THỤ
Các bạn pro quá.
Uhm, Thế cho mình hỏi: Sản xuất là gì? Tiêu thụ là gì?. Trong HDH khi nào cần Sản xuất – Tiêu thụ ?
Uhm, Thế cho mình hỏi: Sản xuất là gì? Tiêu thụ là gì?. Trong HDH khi nào cần Sản xuất – Tiêu thụ ?
Nguyen_Cao_Tri_(I92C)- Tổng số bài gửi : 58
Join date : 21/09/2010
Re: CODE BÀI TẬP VỀ SẢN XUẤT - TIÊU THỤ
Phát biểu bài toán:Sản xuất -Tiêu thụ
- 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
- 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
kimgiap(i92c)- Tổng số bài gửi : 144
Join date : 28/07/2010
Đến từ : Bình Định
Re: CODE BÀI TẬP VỀ SẢN XUẤT - TIÊU THỤ
kimgiap(i92c) đã viết:Tạo 100 luồng sản xuất ở trạng thái Suspend
for(int i=0;i<100;i++)
{
Handle ProducerHandle[i];
DWORD ProducerID[i];
ProducerHandle[i]=CreateThread(0,0(LPTHREAD_START_ROUTINE)Producer,(void *)i,4,&ProducerID[i]);
}
Tạo 50 luồng các nhà tiêu thụ ở trạng thái supend
for(int i=0;i<50;i++)
{
Handle ConsumerHandle[i];
DWORD ConsumerID[i];
ConsumerHandle[i]=CreateThread(0,0(LPTHREAD_START_ROUTINE)Consumer,0,4,&ConsumerID[i];
}
Các bạn và ACE tham gia thảo luận nhé!
Admin
- Về cơ bản đúng.
- Cần đưa 2 dòng khai báo biến mảng ra khỏi vòng lặp và chỉ rõ số phần tử cho chúng (dùng i là sai).
- Chú ý sửa "Handle" thành "HANDLE" cho đúng, vì C "kén" chữ hoa-chữ thường !
Theo ghi chep cua minh trong ham CreateThread cho ca ProcedureHandle va ConsumerHandle deu co 6 tham so.
ProducerHandle[i]=CreateThread(0,0,(LPTHREAD_START_ROUTINE)Producer,(void *)i,4,&ProducerID[i]);
ConsumerHandle[i]=CreateThread(0,0,(LPTHREAD_START_ROUTINE)Consumer,0,0,&ConsumerID[i]);
va trong ConsumerHandle, tham so thu 5 cua CreatThread la 0, khong phai la 4.
Minh cung khong hieu tai sao lai dung (void *)i , ban Giap giai thich them cho minh voi.
Nguyen Thi Tuong Vi(I92C)- Tổng số bài gửi : 10
Join date : 25/09/2010
Re: CODE BÀI TẬP VỀ SẢN XUẤT - TIÊU THỤ
// Tạo các luồng nhưng ở trạng thái ngủ (Suspend)
ProducerHandle1=CreateThread(0,0,
(LPTHREAD_START_ROUTINE)Producer, (void *) 1, 4, &ProducerID1);
nên có cú pháp như vậy.
ProducerHandle1=CreateThread(0,0,
(LPTHREAD_START_ROUTINE)Producer, (void *) 1, 4, &ProducerID1);
nên có cú pháp như vậy.
kimgiap(i92c)- Tổng số bài gửi : 144
Join date : 28/07/2010
Đến từ : Bình Định
Re: CODE BÀI TẬP VỀ SẢN XUẤT - TIÊU THỤ
Mình tìm thấy một bài viết giải thích về tham số của hàm CreateThread bên diễn đàn của lớp I82C :
https://hedieuhanh.forumvi.com/forum-f1/topic-t397.htm
Còn đây là ví dụ về hàm CreateThread có sử dụng Custom data truyền vào cho luồng (cái này copy từ msdn của microsoft
// Sample custom data structure for threads to use.
// This is passed by void pointer so it can be any data type
// that can be passed using a single void pointer (LPVOID).
typedef struct MyData {
int val1;
int val2;
} MYDATA, *PMYDATA;
int _tmain()
{
PMYDATA pDataArray[MAX_THREADS];
DWORD dwThreadIdArray[MAX_THREADS];
HANDLE hThreadArray[MAX_THREADS];
// Create MAX_THREADS worker threads.
for( int i=0; i<MAX_THREADS; i++ )
{
// Allocate memory for thread data.
pDataArray[i] = (PMYDATA) HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY,
sizeof(MYDATA));
if( pDataArray[i] == NULL )
{
// If the array allocation fails, the system is out of memory
// so there is no point in trying to print an error message.
// Just terminate execution.
ExitProcess(2);
}
// Generate unique data for each thread to work with.
pDataArray[i]->val1 = i;
pDataArray[i]->val2 = i+100;
// Create the thread to begin execution on its own.
hThreadArray[i] = CreateThread(
NULL, // default security attributes
0, // use default stack size
MyThreadFunction, // thread function name
pDataArray[i], // argument to thread function
0, // use default creation flags
&dwThreadIdArray[i]); // returns the thread identifier
// Check the return value for success.
// If CreateThread fails, terminate execution.
// This will automatically clean up threads and memory.
if (hThreadArray[i] == NULL)
{
ErrorHandler(TEXT("CreateThread"));
ExitProcess(3);
}
} // End of main thread creation loop.
// Wait until all threads have terminated.
WaitForMultipleObjects(MAX_THREADS, hThreadArray, TRUE, INFINITE);
// Close all thread handles and free memory allocations.
for(int i=0; i<MAX_THREADS; i++)
{
CloseHandle(hThreadArray[i]);
if(pDataArray[i] != NULL)
{
HeapFree(GetProcessHeap(), 0, pDataArray[i]);
pDataArray[i] = NULL; // Ensure address is not reused.
}
}
return 0;
}
Về trạng thái suspend của luồng thì được qui định ở tham số thứ 5 (nếu là 4 thì sẽ ngủ, là 0 sẽ chạy luôn), mình nghĩ vậy, không biết có đúng không
Không rõ chỗ (void *)i của bạn nếu là 0 thì có chạy được không, mình cũng chưa code thử nên không biết ra sao
https://hedieuhanh.forumvi.com/forum-f1/topic-t397.htm
Còn đây là ví dụ về hàm CreateThread có sử dụng Custom data truyền vào cho luồng (cái này copy từ msdn của microsoft
// Sample custom data structure for threads to use.
// This is passed by void pointer so it can be any data type
// that can be passed using a single void pointer (LPVOID).
typedef struct MyData {
int val1;
int val2;
} MYDATA, *PMYDATA;
int _tmain()
{
PMYDATA pDataArray[MAX_THREADS];
DWORD dwThreadIdArray[MAX_THREADS];
HANDLE hThreadArray[MAX_THREADS];
// Create MAX_THREADS worker threads.
for( int i=0; i<MAX_THREADS; i++ )
{
// Allocate memory for thread data.
pDataArray[i] = (PMYDATA) HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY,
sizeof(MYDATA));
if( pDataArray[i] == NULL )
{
// If the array allocation fails, the system is out of memory
// so there is no point in trying to print an error message.
// Just terminate execution.
ExitProcess(2);
}
// Generate unique data for each thread to work with.
pDataArray[i]->val1 = i;
pDataArray[i]->val2 = i+100;
// Create the thread to begin execution on its own.
hThreadArray[i] = CreateThread(
NULL, // default security attributes
0, // use default stack size
MyThreadFunction, // thread function name
pDataArray[i], // argument to thread function
0, // use default creation flags
&dwThreadIdArray[i]); // returns the thread identifier
// Check the return value for success.
// If CreateThread fails, terminate execution.
// This will automatically clean up threads and memory.
if (hThreadArray[i] == NULL)
{
ErrorHandler(TEXT("CreateThread"));
ExitProcess(3);
}
} // End of main thread creation loop.
// Wait until all threads have terminated.
WaitForMultipleObjects(MAX_THREADS, hThreadArray, TRUE, INFINITE);
// Close all thread handles and free memory allocations.
for(int i=0; i<MAX_THREADS; i++)
{
CloseHandle(hThreadArray[i]);
if(pDataArray[i] != NULL)
{
HeapFree(GetProcessHeap(), 0, pDataArray[i]);
pDataArray[i] = NULL; // Ensure address is not reused.
}
}
return 0;
}
Về trạng thái suspend của luồng thì được qui định ở tham số thứ 5 (nếu là 4 thì sẽ ngủ, là 0 sẽ chạy luôn), mình nghĩ vậy, không biết có đúng không
Không rõ chỗ (void *)i của bạn nếu là 0 thì có chạy được không, mình cũng chưa code thử nên không biết ra sao
ngocdangI83C- Tổng số bài gửi : 85
Join date : 04/10/2010
Re: CODE BÀI TẬP VỀ SẢN XUẤT - TIÊU THỤ
Mình đã code thử và thấy là chạy bình thường
ngocdangI83C- Tổng số bài gửi : 85
Join date : 04/10/2010
Similar topics
» code sản xuất và tiêu thụ
» code sản xuất tiêu thụ
» Code vấn đề sản xuất tiêu thụ
» Về các đoạn code sản xuất và tiêu thụ
» Thảo luận Bài 5
» code sản xuất tiêu thụ
» Code vấn đề sản xuất tiêu thụ
» Về các đoạn code sản xuất và tiêu thụ
» Thảo luận Bài 5
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