Одновременная отправка и получение данных от другого работника
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