2013-03-28 2 views
3

Что такое эквивалент «синхронизирован» Java в MATLAB?MATLAB синхронизированный код

Предположим, у меня есть два таймера, и оба они могут изменять переменную (т. Е. Матрицу) M. Если они срабатывают одновременно, оба они попытаются сразу изменить M (что может вызвать ошибки)? MATLAB автоматически синхронизирует такие операции?

+0

Должен сказать, что это ужасное ограничение. Невозможно прервать дорогостоящую операцию с более низким приоритетом (например, построение графика) для быстрой, но более высокоприоритетной операции (управление в реальном времени). –

ответ

3

Matlab 99% однопоточный (другой 1% не имеет отношения к этому вопросу). Таким образом, нет ключевого слова synchronized.

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

Чтобы предотвратить прерывания, используйте свойство interruptible, когда оно доступно (как правило, на объектах графического интерфейса пользователя). Это должно учитывать необходимость предотвращения повторного поведения при работе с обратными вызовами GUI. НАПРИМЕР.

set(gcf,'Interruptible','off') 

Однако это не относится к прерываниям, связанным с таймерами.


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

После некоторого тестирования, это может произойти вблизи pause, drawnow, figure или getframe вызова, которая подразумевается в документации. Он также может возникать рядом с другими вызовами, включая некоторые вызовы tic/toc и вызовы на Java.

Мне не известно о параллельности с параметром Interruptible для таймеров или функций, даже если это может понадобиться. Корневой объект 0 имеет свойство Interruptible, но он не имеет эффекта (согласно документации и подтвержден).

Примечание: это большое изменение по сравнению с предыдущим ответом, который я предоставил (см. Историю), представляющим собой недавнее обучение. В моем предыдущем примере использовались два таймера, которые, как представляется, деконфликт друг с другом. В этом примере используется один таймер плюс функция основной функции.


В качестве примера приведен ниже, демонстрирует один не-прерываемый случай, и два случая, когда функция some_work прерывается.

function minimum_synchronization_example 

%Defune functions to test for interruptability 
%(these are all defined at the bottom of the file) 
fnList = { 
    @fn_expectedNoInterruption 
    @fn_expectedInterruption 
    @fn_unexpectedInterruption 
    }; 
for ix = 1:length(fnList) 
    disp(['---Examples using ' func2str(fnList{ix}) '--------']) 
    test_subfunction_for_interrupt_allowed(fnList{ix}); 
end 
end 

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 
function test_subfunction_for_interrupt_allowed(fn) 
%Setup and start a timer to execute "some_work" 
t1 = timer(); 
set(t1,... 
    'Name','PerformSomeWorkTimer1', ... 
    'TimerFcn', @(~,~) some_work('Timer-1', fn), ... 
    'ExecutionMode','fixedSpacing', ... 
    'Period', 0.4, ... 
    'TasksToExecute', 6, ... 
    'BusyMode', 'drop') 
start(t1); 

%Then immediately execute "some_work" from the main function 
for ix = 1:6 
    some_work('MainFun', fn); 
    pause(0.2); 
end 

%The timer and the loop take about the same amount of time, stop and delete 
%the timer before moving on 
stop(t1); 
delete(t1); 
end 

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 
function some_work(displayString, subFunctionWhichMayAllowInterrupts) 
%Initialize persistent, if needed. 
%This records then umber of active calls to this function. 
persistent entryCount 
if isempty(entryCount) 
    entryCount = 0; 
end 

%Record entry 
entryCount = entryCount+1; 
tic; 

%Perform some work (Inverting a 3000-by-3000 matrix takes about 1 sec on my computer) 
[~] = inv(randn(3000)); 

%Run subfunction to see if it will be interrupted 
subFunctionWhichMayAllowInterrupts(); 

%Display results. How many instances of this function are currently active? 
if entryCount>1; 
    strWarning = 'XXX '; 
else 
    strWarning = ' '; 
end 
disp([strWarning ' <' sprintf('%d',entryCount) '> [' displayString '] ; Duration: ' sprintf('%7.3f',toc)]); 

%Record exit 
entryCount = entryCount-1; 
end 


%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 
function fn_expectedNoInterruption 
x = 1+1; 
end 

function fn_expectedInterruption 
drawnow; 
end 

function fn_unexpectedInterruption 
m = java.util.HashMap(); 
end 
+0

Возможно, стоит заметить, что MATLAB может обрабатывать остальную очередь событий из обратного вызова таймера (т. Е. Для вызова обратного вызова другого таймера), если вы поместили вызов 'pullow' или' pullow update' внутри таймер. Это, однако, все еще однопоточное поведение. – wakjah

Смежные вопросы