exponenta event banner

labSendReceive

Одновременная отправка и получение данных от другого работника

Синтаксис

dataReceived = labSendReceive(rcvWkrIdx,srcWkrIdx,dataSent)
dataReceived = labSendReceive(rcvWkrIdx,srcWkrIdx,dataSent,tag)

Аргументы

dataSent

Данные об отправляющем работнике, отправляемые получающему работнику; любого типа данных MATLAB ®.

dataReceived

Данные, принятые на принимающем работнике.

rcvWkrIdx

labindex принимающего работника, которому отправляются данные.

srcWkrIdx

labindex исходного работника, из которого отправляются данные.

tag

Неотрицательное целое число для идентификации данных.

Описание

dataReceived = labSendReceive(rcvWkrIdx,srcWkrIdx,dataSent) посылает dataSent к работнику, labindex является rcvWkrIdx, и получает dataReceived от работника, labindex является srcWkrIdx. Значения аргументов rcvWkrIdx и srcWkrIdx должны быть скалярами. Эта функция концептуально эквивалентна следующей последовательности вызовов:

labSend(dataSent,rcvWkrIdx);
dataReceived = labReceive(srcWkrIdx);

за тем важным исключением, что и отправка, и получение данных происходят одновременно. Это может устранить взаимоблокировки, которые в противном случае могут возникнуть, если эквивалентный вызов labSend заблокировал бы.

Если rcvWkrIdx является пустым массивом, labSendReceive не отправляет данные, а только принимает. Если srcWkrIdx является пустым массивом, labSendReceive не получает данные, а только отправляет.

dataReceived = labSendReceive(rcvWkrIdx,srcWkrIdx,dataSent,tag) использует указанный тег для связи. tag может быть любым целым числом от 0 кому 32767.

Примеры

Создайте уникальный набор данных о каждом работнике и перенесите данные каждого работника на одного работника вправо (на следующий выше labindex).

Сначала используйте magic функция для создания уникального значения для массива вариантов mydata на каждом работнике.

mydata = magic(labindex)
Lab 1: 
  mydata =
       1
Lab 2:
  mydata =
       1     3
       4     2
Lab 3:
  mydata =
       8     1     6
       3     5     7
       4     9     2

Определите работника с обеих сторон, чтобы каждый работник получал данные от работника с левой стороны, а затем отправлял данные работнику с правой стороны, возвращая данные от конечного работника к начальному работнику.

rcvWkrIdx = mod(labindex, numlabs) + 1; % one worker to the right
srcWkrIdx = mod(labindex - 2, numlabs) + 1; % one worker to the left

Передача данных, отправка данных каждого работника mydata в следующий рабочий otherdata переменная, переносящая данные третьего работника обратно в первый работник.

otherdata = labSendReceive(rcvWkrIdx,srcWkrIdx,mydata)
Lab 1:
  otherdata =
       8     1     6
       3     5     7
       4     9     2
Lab 2:
  otherdata =
       1
Lab 3: 
  otherdata =
       1     3
       4     2

Перенос данных к следующему работнику без переноса данных от последнего работника к первому работнику.

if labindex < numlabs; rcvWkrIdx = labindex + 1; else rcvWkrIdx = []; end;
if labindex > 1; srcWkrIdx = labindex - 1; else srcWkrIdx = []; end;
otherdata = labSendReceive(rcvWkrIdx,srcWkrIdx,mydata)
Lab 1:
  otherdata =
       []
Lab 2:
  otherdata =
       1
Lab 3:
  otherdata =
       1     3
       4     2
Представлен в R2006b