Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2011.06.05;
Скачать: [xml.tar.bz2];

Вниз

Как правильно использовать 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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.47 MB
Время: 0.003 c
15-1298237396
Юрий
2011-02-21 00:29
2011.06.05
С днем рождения ! 21 февраля 2011 понедельник


2-1295467098
Тимоха111
2011-01-19 22:58
2011.06.05
Задержка sleep


1-1256548761
GreyWolf
2009-10-26 12:19
2011.06.05
False virus detection


15-1298150996
Юрий
2011-02-20 00:29
2011.06.05
С днем рождения ! 20 февраля 2011 воскресенье


2-1298571014
nord
2011-02-24 21:10
2011.06.05
ожидание выполнения процедуры





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский