Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Ждущая очередь. WaitForMultipleObjects?

354
04 марта 2008 года
ШпиЁн
468 / / 19.02.2006
проблема такая: есть некий класс очереди.
В программе много потоков и каждый записывает что-то в очередь (запись синхронизирована кр. секциями). примерно так:
 
Код:
void push(T item)
{
EnterCriticalSection(&m_Sync); 
data[m_back] = item;
m_back = (m_back + 1) % (m_capacity);
m_count++;
           
ReleaseSemaphore(hMessageSem, 1, NULL);
LeaveCriticalSection(&m_Sync);
}

при этом счетчик семафора hMessageSem увеличивается на 1.
и есть ОДИН поток, который выбирает из очереди элементы. примерно так:
Код:
DWORD __stdcall manager(LPVOID v)
{
    HANDLE hEvents[] = {m_hExitEvent, hMessageSem};
    DWORD dwRet;
    BOOL bContinue = TRUE;

    while(bContin!!ue)
    {
        dwRet = WaitForMultipleObjects(2, hEvents, FALSE, INFINITE);
        switch(dwRet)
        {
            case WAIT_OBJECT_0: // exit()
            {
                bContinue = FALSE;
                break;
            }
       
            case WAIT_OBJECT_0 + 1: // message()
            {
                Item item = messageQueue.pop();
                cout << item.code << " " << item.text << endl;
                break;
            }
        }
    }
    return 0;
}
Tак вот. программа должна быть нагружена сильно.
через какое-то время WaitForMultipleObjects выдает ошибку WAIT_FAILED, GetLastError() = ERROR_INVALID_HANDLE, хотя с hMessageSem вроде все в порядке.
ЧТО ДЕЛАТЬ?
Может стоит организовать ждущую очередь по другому, есть идеи?
буду рад любой помощи. :)
354
05 марта 2008 года
ШпиЁн
468 / / 19.02.2006
и как реализовать СВОЮ функцию ожидания не прыгая в ядро, и не загружая процессор? :)
255
05 марта 2008 года
Dart Bobr
1.4K / / 09.04.2004
Рихтера смотрел??
По-моему WaitForSingleObject/WaitForMultipleObject как раз и существуют для того чтоб функция не загружала процессор а ожидала.
354
05 марта 2008 года
ШпиЁн
468 / / 19.02.2006
как раз она (WaitForMultipleObjects) у меня и используется.
и с ней странности, в этом и суть темы. :-D
255
05 марта 2008 года
Dart Bobr
1.4K / / 09.04.2004
Это я вижу, ты пропустил первую часть поста - "Рихтера смотрел?". Там разных методов синхронизации потоков описано целая куча.
З.Ы. Имхо, в этом одном потоке в самом начале было б неплохо залочить очередь, а в конце разлочить.
354
05 марта 2008 года
ШпиЁн
468 / / 19.02.2006
у меня метод pop синхронизирован той же критической секцией что и push.
да не в очереди дело - WaitForMultipleObjects вылетает с ошибкой.
Рихтера я посмотрел в_первую_очередь.
потом погуглил - ничего не нашел.
на каком-то англоязычном сайте один чел писал что ТОЖЕ столкнулся с похожей проблемой на WaitForMultipleObjects, и ТОЖЕ ничего не нашел.
Другие методы синхронизации вряд ли подойдут.
---
КАК СДЕЛАТЬ НОРМАЛЬНУЮ ЖДУЩУЮ ОЧЕРЕДЬ? (ВОТ ВОПРОС)
если уж c WaitForMultipleObjects разобраться нельзя...
5.3K
09 марта 2008 года
Somebody
185 / / 24.12.2006
Цитата:
 
Код:
WaitForMultipleObjects(2, hEvents, FALSE, INFINITE);


А hEvents без & C++ нормально переваривает (я в C не очень)?
Мне что-то кажется, в данной программе работа с ним не соответствует логике использования семафоров. Например: где-то push, вызывается Release. А что Release, если его ещё не занимали?
Поэтому вопрос:с какой целью здесь этот семафор, для чего?

354
09 марта 2008 года
ШпиЁн
468 / / 19.02.2006
проблема давно решена. :-D
ReleaseSemaphore увеличивает на какое-то количество счетчик(на 1 у меня), WaitForMultipleObjects уменьшает на 1.
-> сколько раз вызвали ReleaseSemaphore(..., 1, ...), столько раз сработает WaitForMultipleObjects в цикле.
ReleaseSemaphore у меня вызывается в методе push, чтобы методом pop через WaitForMultipleObjects можно было получить какие-то данные, предварительно их дождавшись.
-
PS: я отказался от семафора :-D
использую событие(очередь пустая/непустая).
да даже не в этом дело было, так - мелкие ошибки вообще в другой части программы...
в общем сейчас-то все работает. :)
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог