Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 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.49 MB
Время: 0.009 c
2-1298365017
oleg_teacher
2011-02-22 11:56
2011.06.05
Таблицы, word, delphi


2-1298780760
filimonic
2011-02-27 07:26
2011.06.05
Как заблокировать кнопку Пуск в Windows 7


2-1298361567
viktor
2011-02-22 10:59
2011.06.05
подключение к БД используя РОЛЬ


2-1298520472
IPranker
2011-02-24 07:07
2011.06.05
Как объявить SetWindowLongPtr?


2-1298644603
grigor
2011-02-25 17:36
2011.06.05
Проблема с потоками