WaitForSingleObject не дожидается ReleaseMutex
От: Privaloff  
Дата: 30.12.05 19:28
Оценка:
Проблема в следующем: программа игнорирует нужный мне WaitForSingleObject, продолжая работать дальше. Страсть как обидно.

Привожу исходный текст своего бедствия:

using std::cout;
HANDLE mut;

DWORD WINAPI thread_1(LPVOID lpParameter)
{
    cout<<"Thread 1. Wait...\n";
    Sleep(3000);
    cout<<"3s\n";
    ReleaseMutex(mut);
    CloseHandle(mut);
    return 0;
}

int _tmain(int argc, _TCHAR* argv[])
{
    HANDLE mut = CreateMutex(NULL, false, L"Mutex1");
    
    HANDLE tr1 = CreateThread(NULL, 0, &thread_1, NULL, 0, 0);

    WaitForSingleObject(mut, INFINITE);

    cout<<"Exit...\n";
    Sleep(5000);
    cout<<"5s\n";
    return 0;
}


Предполагалось, что результатом работы будет вот что:

-------------------
Thread 1. Wait...
3s
Exit...
5s
-------------------

А не тут-то было:

-------------------
Exit...
Thread 1. Wait...
3s
5s
-------------------

Т.е. _tmain плюет на WaitForSingleObject(mut, INFINITE) и, не дожидаясь ReleaseMutex(mut), скачет дальше. Почему?

Стоит поменять в WaitForSingleObject mut на tr1 — работает, как полагается.

Re: WaitForSingleObject не дожидается ReleaseMutex
От: programmater  
Дата: 30.12.05 19:55
Оценка:
Здравствуйте, Privaloff, Вы писали:

P>Проблема в следующем: программа игнорирует нужный мне WaitForSingleObject, продолжая работать дальше. Страсть как обидно.


P>Привожу исходный текст своего бедствия:


P>
using std::cout;
P>HANDLE mut;

P>DWORD WINAPI thread_1(LPVOID lpParameter)
P>{
P>    cout<<"Thread 1. Wait...\n";
P>    Sleep(3000);
P>    cout<<"3s\n";
P>    ReleaseMutex(mut);
P>    CloseHandle(mut);
P>    return 0;
P>}

P>int _tmain(int argc, _TCHAR* argv[])
P>{
P>    HANDLE mut = CreateMutex(NULL, false, L"Mutex1");
    
P>    HANDLE tr1 = CreateThread(NULL, 0, &thread_1, NULL, 0, 0);

P>    WaitForSingleObject(mut, INFINITE);

P>    cout<<"Exit...\n";
P>    Sleep(5000);
P>    cout<<"5s\n";
P>    return 0;
P>}


P>Предполагалось, что результатом работы будет вот что:


P>-------------------

P>Thread 1. Wait...
P>3s
P>Exit...
P>5s
P>-------------------

P>А не тут-то было:


P>-------------------

P>Exit...
P>Thread 1. Wait...
P>3s
P>5s
P>-------------------

P>Т.е. _tmain плюет на WaitForSingleObject(mut, INFINITE) и, не дожидаясь ReleaseMutex(mut), скачет дальше. Почему?

Ну дык... А ты его запирать в thread_1 не пробовал? Попробуй, мож. поможет . Естественно WaitForSingleObject(mut, INFINITE) у тебя проваливается, потому как ни один тред не имеет овнершипа над мутексом. И делать ReleaseMutex не владея им как минимум нехорошо.Ну а потом еще и CloseHandle в thread_1 зная, что _tmain ожидает этого мьютекса, это...ну, знаете ли...

В общем поставь WaitForSingleObject(mut, INFINITE) в начале thread_1, должно помочь. Гарантии нет, квантовые эффекты возможны, но с большой вероятностью заработает. И перенеси CloseHandle в _tmain. Насколько я понимаю, она последней осуществляет доступ к мьютексу.

P>Стоит поменять в WaitForSingleObject mut на tr1 — работает, как полагается.

Ну так ясен перец
P>
Re[2]: WaitForSingleObject не дожидается ReleaseMutex
От: Privaloff  
Дата: 30.12.05 20:11
Оценка:
P>Ну дык... А ты его запирать в thread_1 не пробовал? Попробуй, мож. поможет . Естественно WaitForSingleObject(mut, INFINITE) у тебя проваливается, потому как ни один тред не имеет овнершипа над мутексом. И делать ReleaseMutex не владея им как минимум нехорошо.Ну а потом еще и CloseHandle в thread_1 зная, что _tmain ожидает этого мьютекса, это...ну, знаете ли...

Пробовал. Признаюсь, методом тыка "тыкал" WaitForSingleObject'ом и в начало thread_1 Результаты по-прежнему нехорошие.

P>В общем поставь WaitForSingleObject(mut, INFINITE) в начале thread_1, должно помочь. Гарантии нет, квантовые эффекты возможны, но с большой вероятностью заработает. И перенеси CloseHandle в _tmain. Насколько я понимаю, она последней осуществляет доступ к мьютексу.


Поставил, перенес:

----------------------
Exit...
Thread 1. Wait...
3s
5s
----------------------
Re: WaitForSingleObject не дожидается ReleaseMutex
От: Аноним  
Дата: 30.12.05 22:37
Оценка:
Здравствуйте, Privaloff, Вы писали:

Даже если не смотреть на кучу мелких ошибок, то с мьютексом такой вариант все равно не будет работать
Расскажите лучше что Вы хотите сделать?
Re[3]: WaitForSingleObject не дожидается ReleaseMutex
От: programmater  
Дата: 31.12.05 08:15
Оценка:
Здравствуйте, Privaloff, Вы писали:

P>>Ну дык... А ты его запирать в thread_1 не пробовал? Попробуй, мож. поможет . Естественно WaitForSingleObject(mut, INFINITE) у тебя проваливается, потому как ни один тред не имеет овнершипа над мутексом. И делать ReleaseMutex не владея им как минимум нехорошо.Ну а потом еще и CloseHandle в thread_1 зная, что _tmain ожидает этого мьютекса, это...ну, знаете ли...


P>Пробовал. Признаюсь, методом тыка "тыкал" WaitForSingleObject'ом и в начало thread_1 Результаты по-прежнему нехорошие.


P>>В общем поставь WaitForSingleObject(mut, INFINITE) в начале thread_1, должно помочь. Гарантии нет, квантовые эффекты возможны, но с большой вероятностью заработает. И перенеси CloseHandle в _tmain. Насколько я понимаю, она последней осуществляет доступ к мьютексу.


P>Поставил, перенес:


P>----------------------

P>Exit...
P>Thread 1. Wait...
P>3s
P>5s
P>----------------------
Похоже как раз и имеют место "квантовые эффекты". Суть скорее всего в том, что thread_1 не сразу получает управление после CreateThread(). И получается, что _tmain "добирается" до WaitForSingleObject раньше, чем thread_1, а в этот момент мьютекс оказывается свободен, и WaitForSingleObject "проваливается". Для эксперимента в _tmain поставь Sleep(100) перед WaitForSingleObject, должно заработать. А вообще такие вещи "канонически" делаются через Event: _tmain создает Event в nonsignal состоянии, создает нить и входит в WaitForSingleObject, а thread_1 устанавливает Event в signal с помощью SetEvent. Вроде бы тал . А с мьютексом кто первый захватил — тот и прав . Еще для чистоты в конец _tmain желательно поставить ReleaseMutex. Ну это уже так, придирки...
Re: WaitForSingleObject не дожидается ReleaseMutex
От: pavel_turbin  
Дата: 31.12.05 08:26
Оценка:
Здравствуйте, Privaloff, Вы писали:

P>Проблема в следующем: программа игнорирует нужный мне WaitForSingleObject, продолжая работать дальше. Страсть как обидно.


P>Привожу исходный текст своего бедствия:


P>
using std::cout;
P>HANDLE mut;

P>DWORD WINAPI thread_1(LPVOID lpParameter)
P>{
P>    cout<<"Thread 1. Wait...\n";
P>    Sleep(3000);
P>    cout<<"3s\n";
P>    ReleaseMutex(mut);
P>    CloseHandle(mut);
P>    return 0;
P>}

P>int _tmain(int argc, _TCHAR* argv[])
P>{
P>    HANDLE mut = CreateMutex(NULL, false, L"Mutex1");
    
P>    HANDLE tr1 = CreateThread(NULL, 0, &thread_1, NULL, 0, 0);

P>    WaitForSingleObject(mut, INFINITE);

P>    cout<<"Exit...\n";
P>    Sleep(5000);
P>    cout<<"5s\n";
P>    return 0;
P>}


P>Предполагалось, что результатом работы будет вот что:


проблема в "CloseHandle(mut);" Она закрывает handle, в то время пока thread ждущий в WaitForSingleObject, еще не scheduled.

перенесите CloseHandle(mut); в конец tmain и все должно заработать.

btw, вам надо проверять коды возврата из всех API функуций.
Re[2]: WaitForSingleObject не дожидается ReleaseMutex
От: Геннадий Майко США  
Дата: 31.12.05 09:30
Оценка: +1
Здравствуйте, pavel_turbin,

P>>Проблема в следующем: программа игнорирует нужный мне WaitForSingleObject, продолжая работать дальше. Страсть как обидно.


P>>Привожу исходный текст своего бедствия:


P>>
using std::cout;
P>>HANDLE mut;

P>>DWORD WINAPI thread_1(LPVOID lpParameter)
P>>{
P>>    cout<<"Thread 1. Wait...\n";
P>>    Sleep(3000);
P>>    cout<<"3s\n";
P>>    ReleaseMutex(mut);
P>>    CloseHandle(mut);
P>>    return 0;
P>>}

P>>int _tmain(int argc, _TCHAR* argv[])
P>>{
P>>    HANDLE mut = CreateMutex(NULL, false, L"Mutex1");
    
P>>    HANDLE tr1 = CreateThread(NULL, 0, &thread_1, NULL, 0, 0);

P>>    WaitForSingleObject(mut, INFINITE);

P>>    cout<<"Exit...\n";
P>>    Sleep(5000);
P>>    cout<<"5s\n";
P>>    return 0;
P>>}


P>>Предполагалось, что результатом работы будет вот что:


_>проблема в "CloseHandle(mut);" Она закрывает handle, в то время пока thread ждущий в WaitForSingleObject, еще не scheduled.


_>перенесите CloseHandle(mut); в конец tmain и все должно заработать.

--
Наверное, стоит также использовать только одну (глобальную) переменную mut.
А еще лучше — ждать окончания thread непосредсьвенно в WaitForSingleObject.

C уважением,
Геннадий Майко.
Re: WaitForSingleObject не дожидается ReleaseMutex
От: Slicer [Mirkwood] Россия https://ru.linkedin.com/in/maksim-gumerov-039a701b
Дата: 03.01.06 17:27
Оценка:
Что-то не пойму, а почему бы просто не ждать окончания работы вторичного потока? В этом тривиальном примере такой подход кажется вполне приемлемым.

Slicer
Специалист — это варвар, невежество которого не всесторонне :)
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.