Родитель мьютекса

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
Space
Combo-маньяк
Combo-маньяк
 
Сообщения: 818
Зарегистрирован: 11.01.2007 (Чт) 1:19
Откуда: Украина

Родитель мьютекса

Сообщение Space » 30.10.2008 (Чт) 20:05

Если программа завершается некорректно, созданный ею мьютекс остаётся висеть в памяти. Как следующему запущенному экземпляру программы определить, существует ли родитель, создавший мьютекс?

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Re: Родитель мьютекса

Сообщение alibek » 31.10.2008 (Пт) 9:16

Насколько я помню, мютекс убивается, когда убивается родитель.
Lasciate ogni speranza, voi ch'entrate.

Space
Combo-маньяк
Combo-маньяк
 
Сообщения: 818
Зарегистрирован: 11.01.2007 (Чт) 1:19
Откуда: Украина

Re: Родитель мьютекса

Сообщение Space » 31.10.2008 (Пт) 10:57

нет. Создай мьютекс, нажми на Стоп. Второй экземпляр проги не запустится.
Код: Выделить всё
Private Const ERROR_ALREADY_EXISTS = 183&
Private Declare Function CreateMutex Lib "kernel32" Alias "CreateMutexA" (lpMutexAttributes As Any, ByVal bInitialOwner As Long, ByVal lpName As String) As Long

Private Sub Form_Load()
Dim sTemp As String, hMutex As Long
    sTemp = "MyMutex"
    hMutex = CreateMutex(ByVal 0&, 1, sTemp)
    If (Err.LastDllError = ERROR_ALREADY_EXISTS) Then Unload Me
End Sub

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Re: Родитель мьютекса

Сообщение alibek » 31.10.2008 (Пт) 11:08

И кто же, по твоему, в данном случае родитель?
Читай писание:
The system closes the handle automatically when the process terminates. The mutex object is destroyed when its last handle has been closed.
Lasciate ogni speranza, voi ch'entrate.

Space
Combo-маньяк
Combo-маньяк
 
Сообщения: 818
Зарегистрирован: 11.01.2007 (Чт) 1:19
Откуда: Украина

Re: Родитель мьютекса

Сообщение Space » 31.10.2008 (Пт) 12:20

т.е. ты хочешь сказать, как бы не завершилась моя прога, мьютекс будет удалён?

Antonariy
Повелитель Internet Explorer
Повелитель Internet Explorer
Аватара пользователя
 
Сообщения: 4824
Зарегистрирован: 28.04.2005 (Чт) 14:33
Откуда: Мимо проходил

Re: Родитель мьютекса

Сообщение Antonariy » 31.10.2008 (Пт) 12:45

Он хочет сказать, что родитель мютекса в данном случае VB6.EXE, а не твоя прога. По кнопке "стоп" он завершает интерпретацию твоей проги, а не собственную работу.
Лучший способ понять что-то самому — объяснить это другому.

Space
Combo-маньяк
Combo-маньяк
 
Сообщения: 818
Зарегистрирован: 11.01.2007 (Чт) 1:19
Откуда: Украина

Re: Родитель мьютекса

Сообщение Space » 31.10.2008 (Пт) 12:53

ну и Бог с ним. Важно, останется ли мьютекс в памяти после некорректного завершения моего exe-шника.

Antonariy
Повелитель Internet Explorer
Повелитель Internet Explorer
Аватара пользователя
 
Сообщения: 4824
Зарегистрирован: 28.04.2005 (Чт) 14:33
Откуда: Мимо проходил

Re: Родитель мьютекса

Сообщение Antonariy » 31.10.2008 (Пт) 13:25

Это что, до сих пор не понятно?
Лучший способ понять что-то самому — объяснить это другому.

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Re: Родитель мьютекса

Сообщение tyomitch » 31.10.2008 (Пт) 14:27

Кто-нибудь, погуглите WAIT_ABANDONED

А родитель мутекса действительно нигде не сохраняется.
Изображение

Twister
Теоретик
Теоретик
Аватара пользователя
 
Сообщения: 2251
Зарегистрирован: 28.06.2005 (Вт) 12:32
Откуда: Алматы

Re: Родитель мьютекса

Сообщение Twister » 04.11.2008 (Вт) 10:07

Важно, останется ли мьютекс в памяти после некорректного завершения моего exe-шника.
Только если у кого-то остался незакрытым хэндл мьютекса. Родителя мьютекса документированными способами узнать не получится, хотя должен сохраняться в заголовке соответствующего объекта в ядре.
А я все практикую лечение травами...

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Re: Родитель мьютекса

Сообщение tyomitch » 04.11.2008 (Вт) 12:47

Twister писал(а):
Важно, останется ли мьютекс в памяти после некорректного завершения моего exe-шника.
Только если у кого-то остался незакрытым хэндл мьютекса. Родителя мьютекса документированными способами узнать не получится, хотя должен сохраняться в заголовке соответствующего объекта в ядре.

А откуда уверенность, что таки-сохраняется?
Изображение

Twister
Теоретик
Теоретик
Аватара пользователя
 
Сообщения: 2251
Зарегистрирован: 28.06.2005 (Вт) 12:32
Откуда: Алматы

Re: Родитель мьютекса

Сообщение Twister » 04.11.2008 (Вт) 14:44

А откуда уверенность, что таки-сохраняется?

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

Код: Выделить всё
typedef struct _KMUTANT {
    DISPATCHER_HEADER Header;
    LIST_ENTRY MutantListEntry;
    struct _KTHREAD *OwnerThread;
    BOOLEAN Abandoned;
    UCHAR ApcDisable;
} KMUTANT, *PKMUTANT, *PRKMUTANT, KMUTEX, *PKMUTEX, *PRKMUTEX;

VOID
KeInitializeMutant (
    __out PRKMUTANT Mutant,
    __in BOOLEAN InitialOwner
    )

/*++

Routine Description:

    This function initializes a kernel mutant object.

Arguments:

    Mutant - Supplies a pointer to a dispatcher object of type mutant.

    InitialOwner - Supplies a boolean value that determines whether the
        current thread is to be the initial owner of the mutant object.

Return Value:

    None.

--*/

{

    PLIST_ENTRY ListEntry;
    KIRQL OldIrql;
    PRKTHREAD Thread;

    //
    // Initialize standard dispatcher object header, set the owner thread to
    // NULL, set the abandoned state to FALSE, and set the APC disable count
    // to zero (this is the only thing that distinguishes a mutex from a mutant).
    //

    Mutant->Header.Type = MutantObject;
    Mutant->Header.Size = sizeof(KMUTANT) / sizeof(LONG);
    if (InitialOwner == TRUE) {
        Thread = KeGetCurrentThread();
        Mutant->Header.SignalState = 0;
        Mutant->OwnerThread = Thread;
        KiLockDispatcherDatabase(&OldIrql);
        ListEntry = Thread->MutantListHead.Blink;
        InsertHeadList(ListEntry, &Mutant->MutantListEntry);
        KiUnlockDispatcherDatabase(OldIrql);

    } else {
        Mutant->Header.SignalState = 1;
        Mutant->OwnerThread = (PKTHREAD)NULL;
    }

    InitializeListHead(&Mutant->Header.WaitListHead);
    Mutant->Abandoned = FALSE;
    Mutant->ApcDisable = 0;
    return;
}

Так что сорри ;)
А я все практикую лечение травами...


Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 64

    TopList