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
Для просмотра документации необходимо авторизоваться на сайте