Текущий архив: 2011.06.05;
Скачать: CL | DM;
ВнизКак правильно использовать Mutex как замену Critical Section? Найти похожие ветки
← →
Critical Section (2009-10-16 21:38) [0]Есть два приложения (оба - мои), и один разделяемый ресурс (файл), в который нужно писать обоими приложениями. Нужно разделить процедуру записи по времени, что бы приложения не мешали друг другу.
Если бы это было просто многопоточное приложение, то я бы это делал так:
WriteSection.Enter;
try
WriteToFile;
finally
WriteSection.Leave
end;
Как такую функциональность повторить в случае межпроцессной синхронизации? Видел несколько сообщений, что такое возможно сделать Mutex"ом, однако все примеры, что мне попадались предназначены для детектирования приложения в памяти, но не для межпроцессной синхронизации.
Киньте пример, пожалуйста. Заранее благодарю.
← →
Игорь Шевченко © (2009-10-16 23:32) [1]Program Files\Borland\Delphi\Demos\IPCDemos\*.*
← →
Critical Section (2009-10-17 12:41) [2]Спасибо, Игорь, за ответ. Нашел в одном из сборников HowTo"s (DRKB):
Синхронизация процессов при работе с Windows
var
Mutex: THandle;
// При инициализации программы
Mutex := CreateMutex(NIL, FALSE, "UniqueMutexName");
if Mutex = 0 then
RaiseLastWin32Error;
...
// Доступ к ресурсу
WaitForSingleObject(Mutex, INFINITE);
try
// Доступ к ресурсу, захват мутекса гарантирует,
// что остальные процессы пытающиеся получить доступ
// будут остановлены на функции WaitForSingleObject
...
finally
// Работа с ресурсом окончена, освобождаем его
// для остальных процессов
ReleaseMutex(Mutex);
end;
...
// При завершении программы
CloseHandle(Mutex);
Единственное, что мне не нравится - что коды возрвата нигде не анализируются. Интересно, насколько это в жизни критично? Добавил пока как есть - поставил на тест, посмотрим...
← →
Loginov Dmitry © (2009-10-17 12:56) [3]> // При инициализации программы
>
> Mutex := CreateMutex(NIL, FALSE, "UniqueMutexName");
Лучше для создания мьютекса пользоваться такой вот функцией:function DoCreateMutex(AName: string): Cardinal;
var
SD:TSecurityDescriptor;
SA:TSecurityAttributes;
pSA: PSecurityAttributes;
begin
if not InitializeSecurityDescriptor(@SD, SECURITY_DESCRIPTOR_REVISION) then
raise Exception.CreateFmt("Error InitializeSecurityDescriptor: %s", [SysErrorMessage(GetLastError)]);
SA.nLength:=SizeOf(TSecurityAttributes);
SA.lpSecurityDescriptor:=@SD;
SA.bInheritHandle:=False;
if not SetSecurityDescriptorDacl(SA.lpSecurityDescriptor, True, nil, False) then
raise Exception.CreateFmt("Error SetSecurityDescriptorDacl: %s", [SysErrorMessage(GetLastError)]);
pSA := @SA;
Result := CreateMutex(pSA, False, PChar(AName));
if Result = 0 then
raise Exception.CreateFmt("Error CreateMutex: %s", [SysErrorMessage(GetLastError)]);
end;
иначе будут конфликты при запуске программ под разными пользователями.
Ожидать хотя бы так:if WaitForSingleObject(Mutex, INFINITE) = WAIT_OBJECT_0 then
try
...
finally
ReleaseMutex(Mutex);
end else
RaiseLastOsError();
← →
Critical Section (2009-10-18 12:42) [4]Спасибо, поменяю.
← →
Leonid Troyanovsky © (2009-10-18 23:57) [5]
> Critical Section (17.10.09 12:41) [2]
> Единственное, что мне не нравится - что коды возрвата нигде
> не анализируются.
Ну, например, здесь анализируются
if Mutex = 0 then
RaiseLastWin32Error;
> Интересно, насколько это в жизни критично?
Win32Check forever.
Во-ще-то, для файла есть и другие способы, кроме мьютекса.
Даже для memory mapped file можно придумать light mutex.
--
Regards, LVT.
← →
Critical Section (2009-10-20 17:20) [6]>Ну, например, здесь анализируются
Здесь - да.
>Во-ще-то, для файла есть и другие способы, кроме мьютекса.
>Даже для memory mapped file можно придумать light mutex.
Продолжите мысль, пожалуйста...
Насколько интересно вообще в жизни мьютексы медленнее критических секций? Или их на фоне небыстрых операций, как запись файла незаметно?
← →
Riply © (2009-10-20 17:35) [7]> [6] Critical Section (20.10.09 17:20)
> Или их на фоне небыстрых операций, как запись файла незаметно?
Угу. Можно пренебречь
← →
Игорь Шевченко © (2009-10-20 23:34) [8]
> WaitForSingleObject(Mutex, INFINITE);
В этот момент функция может вернуть WAIT_ABANDONED, что означает завршение другого процесса без корректного освобождения мьютекса, но такая ситуация в данном случае будет не страшна и аналогична предоставлению доступа по WAIT_OBJECT_0
Я к чему - можно и не анализировать
← →
Leonid Troyanovsky © (2009-10-21 15:36) [9]
> Critical Section (20.10.09 17:20) [6]
> Продолжите мысль, пожалуйста...
http://msdn.microsoft.com/en-us/magazine/cc302329.aspx
--
Regards, LVT.
Страницы: 1 вся ветка
Текущий архив: 2011.06.05;
Скачать: CL | DM;
Память: 0.47 MB
Время: 0.003 c