Câu hỏi và đáp án cho thứ tư thi nè!!!!!!!!!!
+44
buuhuynh
NguyenTheNam
tranlamxuanhang_107H1029
vhoanghung
TuongVi
diemai
DVD_duynt
toilatoi0285
buiquangthoi
trandinhnghia
thuydung02cm_08H1010019
nhu_nhu
khanh.nd_08H1010044
huynhloitrinh
TruongVanHieu_08H1010030
hochdh
seaman
sonvo
asmking
Thuy Trang
DangQuocCuong107H1010
phamquangminh
caynamnho
trang_tg
nguyenminhchung
VANTHIQUOCVU
khangbui
mylinh
tranlebaolong
linhthy
rama0901
PhamThiKhanhHa
nguyentrungchanh
diemphucnguyen
lethaibaochau
mymy
ntddx
hongntt
phamvietthanh
duongbaphuc
vothuynga
nvhung_107H1040
hienminhchau2005
lqhlam
48 posters
Trang 3 trong tổng số 3 trang
Trang 3 trong tổng số 3 trang • 1, 2, 3
Re: Câu hỏi và đáp án cho thứ tư thi nè!!!!!!!!!!
Ý chà ! không phải là tai mà là "tay" bởi vì muốn qua phải =>> dùng tay :P:D:D:D:DTuongVi đã viết:Chúc cả nhà tai qua nạn khỏi . hi hi
buuhuynh- Tổng số bài gửi : 148
Join date : 06/05/2009
Thanks!!!!!
Cum~ on ban nhiu`,co bai nao` thi post len cho ca lop cung` tham khao nha.Chuc lop minh` cung` vuot qua ki` thi thanh` cong.
ngothimyphuong107h1083- Tổng số bài gửi : 19
Join date : 23/03/2009
Re: Câu hỏi và đáp án cho thứ tư thi nè!!!!!!!!!!
Cam on ban nhieu nha!asmking đã viết:Để mình giải thích lại kỹ hơn cho các bạn hiểu, đầu tiên là phần Thực thi vấn đề "Sản xuất - Tiêu thụ" :
[code:1:eeb0]#include <stdio.h>
#include <conio.h>
#include <windows.h>
#define BUFFER_SIZE 10 [/code:1:eeb0]
_ Định nghĩa kích thước của Buffer chứa các món hàng sản xuất, kích thước 10
[code:1:eeb0]
int buffer[BUFFER_SIZE];
int in=0;
int out=0;
[/code:1:eeb0]
_ Khai báo biến buffer có kích thước 10 chính là nơi chứa các sản phẩm sản xuất.
_ in, out là con trỏ chỉ vị trí của nhà sản xuất & nhà tiêu thụ (in : nhà sản xuất, out : nhà tiêu thụ).
[code:1:eeb0]
int nextProduced=1; // biến nextProduced chứa nội dung của món hàng tiếp theo, khởi tạo là 1
void Producer(){
while (1){
// ... Sản xuất (nextProduced)
while(((in+1)%BUFFER_SIZE)==out);
buffer[in]=nextProduced++;
in=(in+1)%BUFFER_SIZE;
SuspendThread(GetCurrentThread());
}
}
[/code:1:eeb0]
_ Đây là đoạn code của nhà sản xuất(tất cả các nhà sản xuất đều dùng chung đoạn code này).
_ while (((in + 1) % BUFFER_SIZE) == out); -> Lặp vô hạn định cho đến khi buffer có chỗ trống
_ in = (in + 1) % BUFFER_SIZE; -> Đoạn code này chính là Giải pháp duy trì tối đa (BUFFER_SIZE - 1) sản phẩm cùng một lúc trong bộ đệm.
_ SuspendThread(GetCurrentThread()); -> Tạm dừng luồng hiện tại (ở đây chính là nhà sản xuất đang chạy đoạn code này) vô hạn định.
[code:1:eeb0]
void Consumer(){
int nextConsumed;
while (1){
while(in==out);
nextConsumed=buffer[out];
out=(out+1)%BUFFER_SIZE;
// ... Tiêu thụ (nextConsumed)
Sleep(GetTickCount()%5000);
}
}
[/code:1:eeb0]
_ Đây là đoạn code của Nhà tiêu thụ(tất cả các nhà tiêu thụ đều dùng chung đoạn code này).
_ while(in == out); -> Lặp vô hạn cho đến khi có sản phẩm trong buffer
_ out = (out + 1) % BUFFER_SIZE; -> Đoạn code này chính là Giải pháp duy trì tối đa (BUFFER_SIZE - 1) sản phẩm cùng một lúc trong bộ đệm.
_ Sleep(GetTickCount()%5000); -> Cho nhà tiêu thụ ngủ trong thời gian <= 5s, hàm GetTickCount() là để lấy thời gian bắt đầu từ lúc OS khởi động cho đến thời điểm gọi hàm (ms).
[code:1:eeb0]
void ShowBuffer(){ // In nội dung Buffer
...
}
[/code:1:eeb0]
_ Đoạn này dùng để in nội dung Buffer cho nên không cần quan tâm vì chắc chắn thầy ko cho đoạn code dễ như vậy để bắt chúng ta giải thích
_ Đây là đoạn code chính của chương trình(luồng chính).
[code:1:eeb0]
int main(){
HANDLE ProducerHandle1, ProducerHandle2;
HANDLE ConsumerHandle1, ConsumerHandle2;
DWORD ProducerID1, ProducerID2;
DWORD ConsumerID1, ConsumerID2;
[/code:1:eeb0]
_ Đoạn này là khai báo, đã có giải thích kỹ rồi.
[code:1:eeb0]
// Tạo 2 luồng sản xuất trong 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);
[/code:1:eeb0]
_ Tạo 2 luồng sản xuất trong trạng thái ngủ
_ Số 4 được gán vào tham số thứ 5 của hàm CreateThread() chính là để báo luồng sau khi được tạo sẽ bị đưa vào trạng thái ngủ(chắc là ngủ vô hạn nếu không bị đánh thức ).
_ Tất cả các tham số của hàm CreateThread() đã được giải thích kỹ ở trang 1 rồi, các bạn tham khảo lại nha.
[code:1:eeb0]
// Tạo 2 luồng Tiêu thụ thi hành ngay
ConsumerHandle1=CreateThread(0,0,
(LPTHREAD_START_ROUTINE)Consumer,
0, 0, &ConsumerID1);
ConsumerHandle2=CreateThread(0,0,
(LPTHREAD_START_ROUTINE)Consumer,
0, 0, &ConsumerID2);
[/code:1:eeb0]
_ Tạo 2 luồng Tiêu thụ thi hành ngay.
_ Số 0 được gán vào tham số thứ 5 của hàm CreateThread() chính là để báo luồng sau khi được tạo sẽ được thi hành ngay.
_ 2 luồng tiêu thụ được tạo dù được thi hành ngay cũng sẽ chờ vô hạn ở tại vòng lặp while (in == out); bởi vì lúc này trong buffer chưa có sản phẩm nào ( 2 luồng sản xuất vừa được tạo đã được cho ngủ ngay mà, đúng ko )
[code:1:eeb0]
while(1){
printf("\\n- Nhấn P/p để sản xuất, 0 để kết thúc:”);
switch (getch()){
case 'P':
ResumeThread(ProducerHandle1);
break;
case 'p':
ResumeThread(ProducerHandle2);
break;
case '0':
CloseHandle(ProducerHandle1);
CloseHandle(ProducerHandle2);
CloseHandle(ConsumerHandle1);
CloseHandle(ConsumerHandle2);
return 0;
}
Sleep(1);
ShowBuffer();
}
}[/code:1:eeb0]
_ Nhấn P để kích hoạt Nhà sản xuất 1 (ProducerHandle1), nhấn p để kích hoạt NSX 2 (ProducerHandle2).
_ ResumeThread() dùng để đánh thức luồng đang ngủ.
_ Nhấn 0 để kết thúc chương trình, lúc này ta sẽ kết thúc tất cả các NSX & NTT để giải phóng bộ nhớ mà OS dành cho chúng.
_ Sleep(1); -> Phải cho chương trình ngủ 1s trước khi chạy đoạn code ShowBuffer(); để tránh việc hiển thị sai Buffer (do các luồng của NSX & NTT chưa kịp thực thi xong mà Buffer đã được in ra, chỗ này ta cho ngủ 1s là để đề phòng). Mình cảm thấy đoạn code này chính là chỗ chưa hay lắm của giải pháp này
hienminhchau2005- Tổng số bài gửi : 71
Join date : 06/05/2009
Re: Câu hỏi và đáp án cho thứ tư thi nè!!!!!!!!!!
Cam on ban da giai thich code rat ro rang!!!
thiensuhoabinh- Tổng số bài gửi : 51
Join date : 06/03/2009
Re: Câu hỏi và đáp án cho thứ tư thi nè!!!!!!!!!!
Tks mọi người đã share tài liệu.
Chúc các bạn thi tốt!
Chúc các bạn thi tốt!
phamlankhanh- Tổng số bài gửi : 87
Join date : 11/03/2009
Re: Câu hỏi và đáp án cho thứ tư thi nè!!!!!!!!!!
thi xong roài có bạn nào post bài giải không rút kinh nghiệm thi cuối kì.
hitmanmx- Tổng số bài gửi : 35
Join date : 07/05/2009
Trang 3 trong tổng số 3 trang • 1, 2, 3
Trang 3 trong tổng số 3 trang
Permissions in this forum:
Bạn không có quyền trả lời bài viết