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.

Busy waiting.

2 posters

Go down

Busy waiting. Empty Busy waiting.

Bài gửi  HoThiVuong2009 11/5/2009, 11:40

Các bạn ơi mình có đi thực hành nhưng chưa hiểu lắm về bài 5, chỗ dùng busy waitting ấy
Giup mình với
Thanks,
void Producer(){
while (1){
// ... Saûn xuaát (nextProduced)
while(((in+1)%BUFFER_SIZE)==out);
buffer[in]=nextProduced++;
in=(in+1)%BUFFER_SIZE;
SuspendThread(GetCurrentThread());
}
}

void Consumer(){
int nextConsumed;
while (1){
while(in==out);
nextConsumed=buffer[out];
out=(out+1)%BUFFER_SIZE;
// ... Tieâu thuï (nextConsumed)
Sleep(GetTickCount()%5000);
}
}
HoThiVuong2009
HoThiVuong2009

Tổng số bài gửi : 87
Join date : 19/02/2009
Age : 40
Đến từ : Phú Yên

Về Đầu Trang Go down

Busy waiting. Empty Re: Busy waiting.

Bài gửi  Nothing 11/5/2009, 16:23

Theo mình hiểu thì như thế này, bạn nào thấy sai sót thì bỏ sung nhé:

#define BUFFER_SIZE 10
int buffer[BUFFER_SIZE]; //kho chứa được 10 sản phẩm (từ 0 đến 9)

int in=0; // vị trí ban đầu nhà SX
int out=0;// vị trí ban đầu nhà TT
(in = out : kho đầy hoặc chưa có sản phẩm nào)

int nextProduced=1; // Số hiệu ban đầu của sản phẩm

void Producer()
{ while (1)
{
// Sản xuất, lần lập đầu tiên (in=0)
while(((in+1)%BUFFER_SIZE)==out)
=> (0+1)%10)= 1 # out = 0 // kho còn chổ trống để đặt 1 sản phẩm vào, lập đến khi nào còn chổ trống trong kho
=> liên tục kiểm tra xem còn trống không (chờ bận) => tốn CPU
buffer[in]=nextProduced++;
// Đưa 1 sản phẩm vào (gán trước, ++ sau), lúc đó buffer[0] = 1, nextProduced = 2
in=(in+1)%BUFFER_SIZE;
// Tìm vị trí kế để đặt sản phẩm, có xoay vòng khi in = 0 thì in = (0+1)%10 = 1, khi in = 9 thì in = (9+1)%10 = 0  quay lại đầu mảng.
SuspendThread(GetCurrentThread());
// Luồng hiện hành (nhà sản xuất) sản xuất xong 1 sản phẩm thì tạm thời ngủ và chờ đánh thức.
}
}

void Consumer()
{ // Tieu thu
int nextConsumed;
while (1)
{
while(in==out) //liên tục kiểm tra còn sản phẩm không, kho trống thì thoát
nextConsumed=buffer[out]; // lấy 1 sản phẩm ra
out=(out+1)%BUFFER_SIZE; // lấy sản phẩm có xoay vòng
Sleep(GetTickCount()%5000); //TT xong ngủ 1 thời gian
}
}
Nothing
Nothing

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

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