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