Giải bài 5

Xem chủ đề cũ hơn Xem chủ đề mới hơn Go down

Giải bài 5

Bài gửi  ThanhNhan_I83C on 15/12/2009, 10:45

Mình ghi theo trí nhớ, đoạn code không biết có chính xác không?
1. HANDLE semEmpty, semFull;
2. long lgSemFullPreviousValue;
3. semEmpty = CreateSemaphore(0, 0, BUFFER_SIZE, ”semEmpty”);
4. semFull = CreateSemaphore(0, BUFFER_SIZE, BUFFER_SIZE, ”semEmpty”);
5. WaitForSingleObject(semFull, INFINITE);
6. printf(“semFull handle = %d”, semFull);
7. WaitForSingleObject(semFull, INFINITE);
8. printf(“semFull handle = %d”, semFull);
9. ReleaseSemaphore(semFull, 2, &lgSemFullPreviousValue);
10. printf(“semFull handle = %d”, lgSemFullPreviousValue);
11. WaitForSingleObject(semEmpty, INFINITE);
12. printf(“semEmpty handle = %d”, semEmpty);

Trường hợp 1: BUFFER_SIZE = 0
Đoạn mã ngừng ở lệnh 5 mãi mãi. Màn hình không có thông báo gì.
Trường hợp 2: BUFFER_SIZE = 1
In ra màn hình giá trị mục quản (không phải giá trị đèn hiệu) của đèn hiện semFull và ngừng ở lệnh 7 mãi mãi.
Trường hợp 3: BUFFER_SIZE >= 2
In ra màn hình giá trị mục quản (không phải giá trị đèn hiệu) của đèn hiện semFull 2 lần, in ra giá trị của semFull trước đó là BUFFER_SIZE - 2 và ngừng ở lệnh 11 mãi mãi.

Mình sẽ ghi giải thích sau.


Được sửa bởi ThanhNhan_I83C ngày 15/12/2009, 14:28; sửa lần 1.

ThanhNhan_I83C

Tổng số bài gửi : 11
Join date : 10/09/2009

Xem lý lịch thành viên

Về Đầu Trang Go down

Re: Giải bài 5

Bài gửi  ThanhNhan_I83C on 15/12/2009, 11:12

Trước hết giải thích vài dòng lệnh trước:
Dòng 3: tạo đèn hiệu semEmpty có tên là semEmpty, giá trị ban đầu là 0, giá trị lớn nhất là BUFFER_SIZE.
Dòng 4: tạo đèn hiệu semFull có tên là semFull, giá trị ban đầu là BUFFER_SIZE, giá trị lớn nhất là BUFFER_SIZE.
Dòng 5,7,11: Đợi giá trị đèn hiệu >= 1, sau lệnh này giảm đèn hiệu xuống 1 đơn vị.
Dòng 9: Tăng đèn hiệu semFull lên 2 đơn vị và lưu giá trị trước đó vào biến lgSemFullPreviousValue.

Giải thích các trường hợp:
TH1: Đoạn mã ngừng ở lệnh 5 vì giá trị ban đầu semFull là bằng BUFFER_SIZE = 0 mà hàm WaitForSingleObject là đợi giá trị đèn hiệu >=1 mới thực hiện.
TH2: BUFFER_SIZE = 1 => đèn semFull = 1 => đoạn mã chạy đến dòng 5 và qua được hàm WaitForSingleObject
Sau dòng 5 đèn semFull = 1 – 1 = 0, thực hiện dòng 6 in ra giá trị mục quản đèn semFull.
Đến dòng 7 dừng mãi mãi vì đèn semFull = 0.
TH3: BUFFER_SIZE = 2 => đèn semFull = 2 => đoạn mã chạy đến dòng 5 và qua được hàm WaitForSingleObject vì semFull(=2) >= 1
Sau dòng 5 đèn semFull = 2 – 1 = 1, thực hiện dòng 6 in ra giá trị mục quản đèn semFull.
Thực hiện dòng 7 được vì semFull(=1) >= 1, sau dòng 7 đèn semFull = 1 – 1 = 0 => dòng 8 giống dòng 6
Thực hiện dòng 9: tăng semFull(=0) lên 2 đơn vị và lưu lại giá trị trước đó của đèn hiệu => semFull=2 & lgSemFullPreviousValue=0.
Thực hiện dòng 10 in ra màn hình giá trị biến lgSemFullPreviousValue(=0) ra màn hình.
Dòng 11: Do đèn semEmpty giá trị ban đầu luôn là 0 nên dừng ở dòng này mãi mãi.
*Trường hợp BUFFER_SIZE > 2 cũng tương tự như BUFFER_SIZE = 2 nhưng để ý rằng sau lệnh 9 lgSemFullPreviousValue = BUFFER_SIZE - 2

Admin
- Giải đúng, tốt, hay hơn... Đáp án, nhưng chép hơi sai lệnh 10. Kết quả in ra bằng lgSemFullPreviousValue+2 = BUFFER_SIZE
Lệnh đúng là: printf(“SemFull Value = %d”, lgSemFullPreviousValue+2)
- Lần đầu tiên có bạn giải tốt loại câu này. Chúc mừng em !

ThanhNhan_I83C

Tổng số bài gửi : 11
Join date : 10/09/2009

Xem lý lịch thành viên

Về Đầu Trang Go down

Re: Giải bài 5

Bài gửi  ThanhNhan_I83C on 17/12/2009, 15:31

Up up up..., sao không có ai ý kiến gì hết dzậy ta ???, đúng hay sai cũng cho tui biết ý kiến chớ Sad

ThanhNhan_I83C

Tổng số bài gửi : 11
Join date : 10/09/2009

Xem lý lịch thành viên

Về Đầu Trang Go down

Re: Giải bài 5

Bài gửi  kennytai on 17/12/2009, 23:22

mình nghĩ bài này bạn giải thích khá chi tiết. Mình nghĩ bạn giải đúng rùi. Tiếc là bua thi, mình chỉ ghi là đoạn mã sẽ dừng lại mãi ở dòng số 5 hoac dòng số 7 mà ko nói chi tiết. mà sao thầy ko cho tụi mình đáp án lun nhỉ?! hihi........

kennytai

Tổng số bài gửi : 32
Join date : 29/09/2009

Xem lý lịch thành viên

Về Đầu Trang Go down

Re: Giải bài 5

Bài gửi  HoangTan_HCTH083C on 18/12/2009, 08:25

Xem lai can than di. Chu y ngay phan khai bao cua 2 den hieu do, dung de nham lan nha cac ban. Chu y den hieu SemFull. do gia tri khoi tao va gia tri max deu la Buffer_Size. Chi vay thoi
avatar
HoangTan_HCTH083C

Tổng số bài gửi : 68
Join date : 30/09/2009
Age : 32
Đến từ : Tien Giang

Xem lý lịch thành viên http://www.tranthinh.com

Về Đầu Trang Go down

Re: Giải bài 5

Bài gửi  dzangdzang on 18/12/2009, 15:46

Mình thấy bạn thanhnhan... giải gần chính xát rồi đấy, mình cũng làm gần giống bạn, thanks !

dzangdzang

Tổng số bài gửi : 5
Join date : 15/10/2009

Xem lý lịch thành viên

Về Đầu Trang Go down

Re: Giải bài 5

Bài gửi  buinghaibinh107h1006 on 19/12/2009, 08:03

Mình thì chẳng giải thích cụ thể như bạn đc. Bài của bạn tốt quá. Thanks bạn Smile

buinghaibinh107h1006

Tổng số bài gửi : 3
Join date : 19/12/2009
Age : 33

Xem lý lịch thành viên

Về Đầu Trang Go down

Re: Giải bài 5

Bài gửi  lovehardware85 on 19/12/2009, 09:12

Chào bạn, bạn có thể nói rõ hơn cho mình một chút vế đoạn lệnh ReleaseSemaphore(semFull, 2, &lgSemFullPreviousValue) không?, tại vì theo như mình biết là biến lgSemFullPreviousValue là biến trả về giá trị trước đó, mình không hiếu chỗ này cho lắm. Thanks

lovehardware85

Tổng số bài gửi : 8
Join date : 07/12/2009

Xem lý lịch thành viên

Về Đầu Trang Go down

Re: Giải bài 5

Bài gửi  trankhanhtram_I83C_2106 on 19/12/2009, 13:50

Cám ơn bạn nhiều, mình chỉ giải thích được đoạn trên cùng..!!
avatar
trankhanhtram_I83C_2106

Tổng số bài gửi : 32
Join date : 10/09/2009

Xem lý lịch thành viên

Về Đầu Trang Go down

Re: Giải bài 5

Bài gửi  tamnguyen on 19/12/2009, 21:17

Mình nghĩ Thanhnhan giải thích như vậy là khá chính xác. Mình thì không làm được chi tiết giống như bạn được. Thanks về bài giải của bạn.

tamnguyen

Tổng số bài gửi : 11
Join date : 14/08/2009

Xem lý lịch thành viên

Về Đầu Trang Go down

Re: Giải bài 5

Bài gửi  spaceman27 on 21/12/2009, 10:49

bài giảo good lắm. chúc mừng bạn.

spaceman27

Tổng số bài gửi : 20
Join date : 25/09/2009

Xem lý lịch thành viên

Về Đầu Trang Go down

Re: Giải bài 5

Bài gửi  trungdungI83C on 21/12/2009, 11:07

Thanks bạn thanhnhan! Mình nghĩ mình giải thích gần với ý bạn, nhưng chi tiết thì không được chi tiết như bạn!
avatar
trungdungI83C

Tổng số bài gửi : 23
Join date : 26/11/2009
Age : 33
Đến từ : Thành phố Hồ Chí Minh

Xem lý lịch thành viên

Về Đầu Trang Go down

Re: Giải bài 5

Bài gửi  ThanhNhan_I83C on 22/12/2009, 14:38

@Admin: Em xin cám ơn Thầy. Do dòng lệnh 10 nằm tuốt bên kia bảng gần cửa ra vào chói quá chắc em ghi thiếu Smile

ThanhNhan_I83C

Tổng số bài gửi : 11
Join date : 10/09/2009

Xem lý lịch thành viên

Về Đầu Trang Go down

Re: Giải bài 5

Bài gửi  myhanh on 24/12/2009, 14:59

ThanhNhan_I83C đã viết:Trước hết giải thích vài dòng lệnh trước:
Dòng 3: tạo đèn hiệu semEmpty có tên là semEmpty, giá trị ban đầu là 0, giá trị lớn nhất là BUFFER_SIZE.
Dòng 4: tạo đèn hiệu semFull có tên là semFull, giá trị ban đầu là BUFFER_SIZE, giá trị lớn nhất là BUFFER_SIZE.
Dòng 5,7,11: Đợi giá trị đèn hiệu >= 1, sau lệnh này giảm đèn hiệu xuống 1 đơn vị.
Dòng 9: Tăng đèn hiệu semFull lên 2 đơn vị và lưu giá trị trước đó vào biến lgSemFullPreviousValue.

Giải thích các trường hợp:
TH1: Đoạn mã ngừng ở lệnh 5 vì giá trị ban đầu semFull là bằng BUFFER_SIZE = 0 mà hàm WaitForSingleObject là đợi giá trị đèn hiệu >=1 mới thực hiện.
TH2: BUFFER_SIZE = 1 => đèn semFull = 1 => đoạn mã chạy đến dòng 5 và qua được hàm WaitForSingleObject
Sau dòng 5 đèn semFull = 1 – 1 = 0, thực hiện dòng 6 in ra giá trị mục quản đèn semFull.
Đến dòng 7 dừng mãi mãi vì đèn semFull = 0.
TH3: BUFFER_SIZE = 2 => đèn semFull = 2 => đoạn mã chạy đến dòng 5 và qua được hàm WaitForSingleObject vì semFull(=2) >= 1
Sau dòng 5 đèn semFull = 2 – 1 = 1, thực hiện dòng 6 in ra giá trị mục quản đèn semFull.
Thực hiện dòng 7 được vì semFull(=1) >= 1, sau dòng 7 đèn semFull = 1 – 1 = 0 => dòng 8 giống dòng 6
Thực hiện dòng 9: tăng semFull(=0) lên 2 đơn vị và lưu lại giá trị trước đó của đèn hiệu => semFull=2 & lgSemFullPreviousValue=0.
Thực hiện dòng 10 in ra màn hình giá trị biến lgSemFullPreviousValue(=0) ra màn hình.
Dòng 11: Do đèn semEmpty giá trị ban đầu luôn là 0 nên dừng ở dòng này mãi mãi.
*Trường hợp BUFFER_SIZE > 2 cũng tương tự như BUFFER_SIZE = 2 nhưng để ý rằng sau lệnh 9 lgSemFullPreviousValue = BUFFER_SIZE - 2

Admin
- Giải đúng, tốt, hay hơn... Đáp án, nhưng chép hơi sai lệnh 10. Kết quả in ra bằng lgSemFullPreviousValue+2 = BUFFER_SIZE
Lệnh đúng là: printf(“SemFull Value = %d”, lgSemFullPreviousValue+2)
- Lần đầu tiên có bạn giải tốt loại câu này. Chúc mừng em !
Bữa giờ mong mãi câu khen của Thầy. vì Thầy khen là chúng em có lời giải chính xác nhất.
Cảm ơn Thầy. Cảm ơn ThanhNhan
avatar
myhanh

Tổng số bài gửi : 67
Join date : 17/03/2009

Xem lý lịch thành viên

Về Đầu Trang Go down

Re: Giải bài 5

Bài gửi  hoangthuy_i83c on 24/12/2009, 18:29

[quote="ThanhNhan_I83C"]Trước hết giải thích vài dòng lệnh trước:
Dòng 3: tạo đèn hiệu semEmpty có tên là semEmpty, giá trị ban đầu là 0, giá trị lớn nhất là BUFFER_SIZE.
Dòng 4: tạo đèn hiệu semFull có tên là semFull, giá trị ban đầu là BUFFER_SIZE, giá trị lớn nhất là BUFFER_SIZE.
Dòng 5,7,11: Đợi giá trị đèn hiệu >= 1, sau lệnh này giảm đèn hiệu xuống 1 đơn vị.
Dòng 9: Tăng đèn hiệu semFull lên 2 đơn vị và lưu giá trị trước đó vào biến lgSemFullPreviousValue.

Giải thích các trường hợp:
TH1: Đoạn mã ngừng ở lệnh 5 vì giá trị ban đầu semFull là bằng BUFFER_SIZE = 0 mà hàm WaitForSingleObject là đợi giá trị đèn hiệu >=1 mới thực hiện.
TH2: BUFFER_SIZE = 1 => đèn semFull = 1 => đoạn mã chạy đến dòng 5 và qua được hàm WaitForSingleObject
Sau dòng 5 đèn semFull = 1 – 1 = 0, thực hiện dòng 6 in ra giá trị mục quản đèn semFull.
Đến dòng 7 dừng mãi mãi vì đèn semFull = 0.
TH3: BUFFER_SIZE = 2 => đèn semFull = 2 => đoạn mã chạy đến dòng 5 và qua được hàm WaitForSingleObject vì semFull(=2) >= 1
Sau dòng 5 đèn semFull = 2 – 1 = 1, thực hiện dòng 6 in ra giá trị mục quản đèn semFull.
Thực hiện dòng 7 được vì semFull(=1) >= 1, sau dòng 7 đèn semFull = 1 – 1 = 0 => dòng 8 giống dòng 6
Thực hiện dòng 9: tăng semFull(=0) lên 2 đơn vị và lưu lại giá trị trước đó của đèn hiệu => semFull=2 & lgSemFullPreviousValue=0.
Thực hiện dòng 10 in ra màn hình giá trị biến lgSemFullPreviousValue(=0) ra màn hình.
Dòng 11: Do đèn semEmpty giá trị ban đầu luôn là 0 nên dừng ở dòng này mãi mãi.
*Trường hợp BUFFER_SIZE > 2 cũng tương tự như BUFFER_SIZE = 2 nhưng để ý rằng sau lệnh 9 lgSemFullPreviousValue = BUFFER_SIZE - 2


Oh, thanks aNhan nha. Bài giải này chi tiết wa.

hoangthuy_i83c

Tổng số bài gửi : 4
Join date : 14/09/2009

Xem lý lịch thành viên

Về Đầu Trang Go down

Re: Giải bài 5

Bài gửi  Buivanhieu_I83C on 25/12/2009, 07:44

ThanhNhan_I83C đã viết:Trước hết giải thích vài dòng lệnh trước:
Dòng 3: tạo đèn hiệu semEmpty có tên là semEmpty, giá trị ban đầu là 0, giá trị lớn nhất là BUFFER_SIZE.
Dòng 4: tạo đèn hiệu semFull có tên là semFull, giá trị ban đầu là BUFFER_SIZE, giá trị lớn nhất là BUFFER_SIZE.
Dòng 5,7,11: Đợi giá trị đèn hiệu >= 1, sau lệnh này giảm đèn hiệu xuống 1 đơn vị.
Dòng 9: Tăng đèn hiệu semFull lên 2 đơn vị và lưu giá trị trước đó vào biến lgSemFullPreviousValue.

Giải thích các trường hợp:
TH1: Đoạn mã ngừng ở lệnh 5 vì giá trị ban đầu semFull là bằng BUFFER_SIZE = 0 mà hàm WaitForSingleObject là đợi giá trị đèn hiệu >=1 mới thực hiện.
TH2: BUFFER_SIZE = 1 => đèn semFull = 1 => đoạn mã chạy đến dòng 5 và qua được hàm WaitForSingleObject
Sau dòng 5 đèn semFull = 1 – 1 = 0, thực hiện dòng 6 in ra giá trị mục quản đèn semFull.
Đến dòng 7 dừng mãi mãi vì đèn semFull = 0.
TH3: BUFFER_SIZE = 2 => đèn semFull = 2 => đoạn mã chạy đến dòng 5 và qua được hàm WaitForSingleObject vì semFull(=2) >= 1
Sau dòng 5 đèn semFull = 2 – 1 = 1, thực hiện dòng 6 in ra giá trị mục quản đèn semFull.
Thực hiện dòng 7 được vì semFull(=1) >= 1, sau dòng 7 đèn semFull = 1 – 1 = 0 => dòng 8 giống dòng 6
Thực hiện dòng 9: tăng semFull(=0) lên 2 đơn vị và lưu lại giá trị trước đó của đèn hiệu => semFull=2 & lgSemFullPreviousValue=0.
Thực hiện dòng 10 in ra màn hình giá trị biến lgSemFullPreviousValue(=0) ra màn hình.
Dòng 11: Do đèn semEmpty giá trị ban đầu luôn là 0 nên dừng ở dòng này mãi mãi.
*Trường hợp BUFFER_SIZE > 2 cũng tương tự như BUFFER_SIZE = 2 nhưng để ý rằng sau lệnh 9 lgSemFullPreviousValue = BUFFER_SIZE - 2


Mình bổ sung vào dòng 3, và dòng 4 một chút như sau:
Dòng 3: tạo đèn hiệu "liên tiến trình" semEmpty có tên là semEmpty, giá trị ban đầu là 0, giá trị lớn nhất là BUFFER_SIZE.
Dòng 4: tạo đèn hiệu "liên tiến trình" semFull có tên là semFull, giá trị ban đầu là BUFFER_SIZE, giá trị lớn nhất là BUFFER_SIZE.

TH1: Đoạn mã ngừng ở lệnh 5 vì giá trị ban đầu semFull là bằng BUFFER_SIZE = 0 mà hàm WaitForSingleObject là đợi giá trị đèn hiệu >=1 mới thực hiện.
Lớn hơn 0 là được rùi chứ

Buivanhieu_I83C

Tổng số bài gửi : 42
Join date : 11/09/2009

Xem lý lịch thành viên

Về Đầu Trang Go down

cau 5

Bài gửi  thien77777 on 1/1/2010, 03:28

thanks ban nhieu!con nhieu cho mih chua hieu qua...co them chut kien thuc nua roi Very Happy

thien77777

Tổng số bài gửi : 10
Join date : 10/11/2009

Xem lý lịch thành viên

Về Đầu Trang Go down

Giải câu 5

Bài gửi  hoainam_I83C on 3/1/2010, 20:58

Cảm ơn lời giải của các bạn, xem xong thì mình hiểu thêm phần nào rồi

hoainam_I83C

Tổng số bài gửi : 40
Join date : 03/12/2009

Xem lý lịch thành viên

Về Đầu Trang Go down

Re: Giải bài 5

Bài gửi  Sponsored content


Sponsored content


Về Đầu Trang Go down

Xem chủ đề cũ hơn Xem chủ đề mới hơn Về Đầu Trang


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