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.

CODE BÀI TẬP VỀ SẢN XUẤT - TIÊU THỤ

+2
luonghuytai(I92C)
kimgiap(i92c)
6 posters

Go down

CODE BÀI TẬP VỀ SẢN XUẤT - TIÊU THỤ Empty CODE BÀI TẬP VỀ SẢN XUẤT - TIÊU THỤ

Bài gửi  kimgiap(i92c) 25/10/2010, 21:36

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 !
kimgiap(i92c)
kimgiap(i92c)

Tổng số bài gửi : 144
Join date : 28/07/2010
Đến từ : Bình Định

Về Đầu Trang Go down

CODE BÀI TẬP VỀ SẢN XUẤT - TIÊU THỤ Empty Re: CODE BÀI TẬP VỀ SẢN XUẤT - TIÊU THỤ

Bài gửi  luonghuytai(I92C) 25/10/2010, 22:33

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 ! clown
luonghuytai(I92C)
luonghuytai(I92C)

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

Về Đầu Trang Go down

CODE BÀI TẬP VỀ SẢN XUẤT - TIÊU THỤ Empty Re: CODE BÀI TẬP VỀ SẢN XUẤT - TIÊU THỤ

Bài gửi  kimgiap(i92c) 25/10/2010, 22:44

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)
kimgiap(i92c)

Tổng số bài gửi : 144
Join date : 28/07/2010
Đến từ : Bình Định

Về Đầu Trang Go down

CODE BÀI TẬP VỀ SẢN XUẤT - TIÊU THỤ Empty Re: CODE BÀI TẬP VỀ SẢN XUẤT - TIÊU THỤ

Bài gửi  ngocdangI83C 26/10/2010, 10:09

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

Về Đầu Trang Go down

CODE BÀI TẬP VỀ SẢN XUẤT - TIÊU THỤ Empty Re: CODE BÀI TẬP VỀ SẢN XUẤT - TIÊU THỤ

Bài gửi  DinhTranHoangQuan_I92C 26/10/2010, 10:26

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).

DinhTranHoangQuan_I92C

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

Về Đầu Trang Go down

CODE BÀI TẬP VỀ SẢN XUẤT - TIÊU THỤ Empty Re: CODE BÀI TẬP VỀ SẢN XUẤT - TIÊU THỤ

Bài gửi  Nguyen_Cao_Tri_(I92C) 26/10/2010, 13:56

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ụ ?


Nguyen_Cao_Tri_(I92C)

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

Về Đầu Trang Go down

CODE BÀI TẬP VỀ SẢN XUẤT - TIÊU THỤ Empty Re: CODE BÀI TẬP VỀ SẢN XUẤT - TIÊU THỤ

Bài gửi  kimgiap(i92c) 26/10/2010, 15:45

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
kimgiap(i92c)
kimgiap(i92c)

Tổng số bài gửi : 144
Join date : 28/07/2010
Đến từ : Bình Định

Về Đầu Trang Go down

CODE BÀI TẬP VỀ SẢN XUẤT - TIÊU THỤ Empty Re: CODE BÀI TẬP VỀ SẢN XUẤT - TIÊU THỤ

Bài gửi  Nguyen Thi Tuong Vi(I92C) 27/10/2010, 06:12

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

Về Đầu Trang Go down

CODE BÀI TẬP VỀ SẢN XUẤT - TIÊU THỤ Empty Re: CODE BÀI TẬP VỀ SẢN XUẤT - TIÊU THỤ

Bài gửi  kimgiap(i92c) 27/10/2010, 12:47

// 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.
kimgiap(i92c)
kimgiap(i92c)

Tổng số bài gửi : 144
Join date : 28/07/2010
Đến từ : Bình Định

Về Đầu Trang Go down

CODE BÀI TẬP VỀ SẢN XUẤT - TIÊU THỤ Empty Re: CODE BÀI TẬP VỀ SẢN XUẤT - TIÊU THỤ

Bài gửi  ngocdangI83C 27/10/2010, 13:37

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

ngocdangI83C

Tổng số bài gửi : 85
Join date : 04/10/2010

Về Đầu Trang Go down

CODE BÀI TẬP VỀ SẢN XUẤT - TIÊU THỤ Empty Re: CODE BÀI TẬP VỀ SẢN XUẤT - TIÊU THỤ

Bài gửi  ngocdangI83C 28/10/2010, 10:11

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

Về Đầu Trang Go down

CODE BÀI TẬP VỀ SẢN XUẤT - TIÊU THỤ Empty Re: CODE BÀI TẬP VỀ SẢN XUẤT - TIÊU THỤ

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