Одновременно отправляйте и получайте данные от другого работника
dataReceived = labSendReceive(rcvWkrIdx,srcWkrIdx,dataSent)
dataReceived = labSendReceive(rcvWkrIdx,srcWkrIdx,dataSent,tag)
| Данные о работнике-отправителе, который отправляется получающему работнику; любой MATLAB® тип данных. |
| Данные, принятые на получающем работнике. |
|
|
|
|
| Неотрицательное целое число для идентификации данных. |
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 2labBarrier | labindex | labProbe | labReceive | labSend | numlabs