Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> mutex 
V
    Опции темы
xTr1m
Дата 27.6.2012, 16:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 692
Регистрация: 9.2.2005
Где: Москва

Репутация: 1
Всего: 1



Вообще код из MFC, но принцип, думаю, одинаковый везде.

Код

m_hShared = OpenMutex(MUTEX_ALL_ACCESS, FALSE, L"FileMutexEx");

if(m_hShared)
{
    WaitForSingleObject(m_hShared, INFINITE);
}
else 
{
    m_hShared = CreateMutex(NULL, TRUE, L"FileMutexEx");
}

AfxMessageBox(L"Ресурс залочен");


если запустить два exe файла и в одном вызвать эту функцию, то все ок: первая программа создает мьютекс, если во второй программе выполнить это, то она будет ждать завершения. 
А если запустить один экземпляр и несколько раз выполнить это, то WaitForSingleObject(m_hShared, INFINITE); не ждет. Это нормально? Может я просто не понимаю чего-то?
PM MAIL WWW ICQ   Вверх
hawk3500
Дата 27.6.2012, 16:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 246
Регистрация: 6.2.2009

Репутация: нет
Всего: 2



Джеффери Рихтер.
Создание эффективных WIN32-приложений.
Глава 9 - Синхронизация потоков с использованием объектов ядра 

Там всё подробно расписанно.
--------------------
воин dzen'a
PM MAIL   Вверх
xTr1m
Дата 27.6.2012, 18:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 692
Регистрация: 9.2.2005
Где: Москва

Репутация: 1
Всего: 1



Прочел, но так и не понял, что произойдет, если два раза вызвать такое из одного и того же потока
Код

if(m_lock.IsLocked())
{
    WaitForSingleObject(m_mutex.m_hObject, INFINITE);
}
else
{
    m_lock.Lock();    
}


повторюсь, что если этот код вызывается из двух разных потоков, то все ок: второй поток ожидает завершения. но если я вызову этот код из одного потока, потом из второго, то второй уже никогда не получает управление, даже если я делаю unlock в первом потоке.

Добавлено через 10 минут и 26 секунд
Переделал на

Код

if(m_lock.IsLocked() == false)
    m_lock.Lock();


стало работать. но это уже с обертками MFC. а WInAPI как в первом примере не работает.
PM MAIL WWW ICQ   Вверх
xTr1m
Дата 27.6.2012, 19:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 692
Регистрация: 9.2.2005
Где: Москва

Репутация: 1
Всего: 1



Код

m_hShared = OpenMutex(MUTEX_ALL_ACCESS, TRUE, L"FileMutexEx");
if(m_hShared)
    WaitForSingleObject(m_hShared, INFINITE);                    
        
m_hShared = CreateMutex(NULL, TRUE, L"FileMutexEx");


Если два раза из одного и того же потока вызвать этот код, то проблема следующая. Во второй раз при вызове CreateMutex возвращается новый хендл, однако происходит ошибка, в которой говорится, 
что мьютекс уже существует. То есть получается, что создать не получилось, но какой-то хендл возвращается. Как так?
PM MAIL WWW ICQ   Вверх
xTr1m
Дата 27.6.2012, 20:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 692
Регистрация: 9.2.2005
Где: Москва

Репутация: 1
Всего: 1



Заработало вот так
Код

void CMutexDlg::CreateMutex()
{
    m_hShared = OpenMutex(MUTEX_ALL_ACCESS, FALSE, L"FileMutexEx");
    if(m_hShared)
        WaitForSingleObject(m_hShared, INFINITE);                   
            
    m_handles.push_back(CreateMutex(NULL, TRUE, L"FileMutexEx"));
    AfxMessageBox(L"Ресурс залочен");
}
 
void CMutexDlg::ReleaseMutex()
{
    if(m_handles.size() > 0)
    {
        HANDLE h = m_handles[m_handles.size()-1];
        ReleaseMutex(h);
        CloseHandle(h);
        m_handles.erase(m_handles.begin() + m_handles.size() - 1);
        
        AfxMessageBox(L"ресурс освобожден");
    }
}


но меня смущает такая реализация. неужели так и делают?
PM MAIL WWW ICQ   Вверх
xvr
Дата 28.6.2012, 12:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 60
Всего: 223



Цитата(xTr1m @  27.6.2012,  20:32 Найти цитируемый пост)
но меня смущает такая реализация. 

Правильно смущает. Вы что получить то в конце концов хотите?

PM MAIL   Вверх
xTr1m
Дата 3.7.2012, 17:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 692
Регистрация: 9.2.2005
Где: Москва

Репутация: 1
Всего: 1



Разобрался. Штука в том, что я не предполагал, что WaitForSingleObject не только блокирует поток, но еще и захватывает ему мьютекс, когда дожидается
PM MAIL WWW ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1163 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.