Nhận tin nhắn

Một phần của tài liệu Các hệ vi xử lý tiên tiến (Trang 84 - 86)

PVM hỗ trợ ba loại hàm nhận tin nhắn: blocking, nonblocking, và timeout. Khi gọi một hàm nhận blocking, tác vụ nhận phải đợi cho đến khi tin nhắn truyền tới bộ đệm nhận. Một hàm nhận nonblocking ngay lập tức trả về dữ liệu dự kiến hoặc một cờ mà các dữ không đến được. Hàm nhận Timeout cho phép lập trình viên xác định được khoảng thời gian mà hàm nhận phải đợi trước khi trả về. Nếu thời gian timeout quá dài , hàm này sẽ đóng vai trò như hàm nhận blocking. Mặt khác, nếu thời gian timeout được đặt là không,thì nó hoạt động giống như trường hợp nonblocking. Hình 8.5 minh họa ba kiểu hoạt động nhận.

Blocking: Nhận thông điệp có chờ

Nonblocking: Nhận thông điệp không chờ

Blocking Receive

Hàm này sẽ chờ cho đến khi một tin nhắn với thẻ label nhận được từ một tác vụ với TID= tid. Một giá trị bằng - 1 có thể được sử dụng như một kí tự đại diện để khớp với một trong các đối số: tid hoặc tag. Nhận thành công sẽ tạo ra một bộ đệm nhận và trả về bộ nhận dạng bộ đệm sử dụng trong việc giải nén tin nhắn.

Hình 8.5 Ba loại hoạt động nhận.

Nonblocking Receive

Bufid = pvm_nrecv(tid, tag)

Nếu tin nhắn đến thành công khi hàm này được gọi, nó sẽ trả về bộ nhận dạng bộ đệm tương tự như trường hợp nhận blocking. Tuy nhiên, nếu tin nhắn dự kiến đã không đến được thì ngay lập tức hàm sẽ trả về với bufid = 0.

Timeout Receive

Bufid = pvm_trecv(tid, tag, timeout)

Hàm này chặn việc thực hiện tác vụ gọi cho đến khi một tin nhắn với một tag label đã đến từ tid trong một khoảng thời gian chờ nhất định. Nếu không có tin nhắn thích hợp nào đến trong thời gian đợi xác định, hàm này sẽ trả về bufid = 0, cho biết không có tin nhắn nào được nhận. Đối số thời gian chờ (thời gian chờ đợi khi máy tính đang vận hành) là một cấu trúc với hai trường số nguyên tv_sec và tv_usec. Khi cả hai trường được đặt bằng không, hàm này sẽ đóng vai trò như một hàm nhận không chờ. Cho một con trỏ null đi qua như timeout làm cho hàm này đóng vai trò như hàm nhận chờ. Nếu hàm pvm_trecv () có hiệu lực, bufid sẽ có giá trị của bộ nhận dạng bộ đệm nhận hoạt động mới.

Tiếp nhận và giải nén trong Một Bước (Receive and Unpack in One Step) Tương

tự như hàm pvm_psend (), PVM cung cấp hàm pvm_precv (), hàm này kết hợp các hàm nhận chờ và giải nén trong một đoạn chương trình. Nó không trả về bộ nhận dạng bộ đệm, thay vào đó nó sẽ trả về các giá trị thực . Ví dụ, lời gọi hàm sau đây

Info = pvm_precv(tid, tag, my_array, len, datatype, &src,&atag, &alen) sẽ chặn cho

đến khi một tin nhắn phù hợp được nhận. Các nội dung của tin nhắn sẽ được lưu trong mảng my_array lên đến chiều dài len. Ngoài các info mã trạng thái, TID thực sự của đối tượng gửi, tag tin nhắn thực, và độ dài tin nhắn thực lần lượt được trả về trong src, ATAG, và alen tương ứng. Một lần nữa, giá trị - 1 có thể được sử dụng như một kí tự đại diện cho các đối số: tag or tid.

Một phần của tài liệu Các hệ vi xử lý tiên tiến (Trang 84 - 86)