Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Системное программирование и WinAPI > Синхронизация работы потоков


Автор: The_Thing 10.1.2008, 10:42
Проблемс такая:
В приложении создается N потоков (от 5 до 15), каждый из которых еще создает свой таймер ( CreateTimerQueueTimer - отдельный попток). И вот все эти Threads работают с одним и тем же блоком памяти.
И получается такая штука, что запрос типа m_arrModel.erase( m_arrModel.begin() ); где m_arrModel.size() != 0 выдает ошибки, в какой-то момент времени. Ну или вставка в начало или конец массива, сортировка std::sort и т д.

Слышал про семафоры CSemaphore, открыл MSDN а там кроме конструктора у него ничего нет... меня это ввело в заблуждение. smile
Вообще посмотрел на такие вещи как CSinglLock и CMultiLock, но как их применить? Если я даже добьюсь последовательной блокировки, То программа потеряет смысл, так как становится последовательной.

Спасибо всем, кто осмелился прочесть этот длиннющий рассказ.
Поделитесь опытом пожалуйста.

Автор: Lazin 10.1.2008, 10:46
нужно, чтобы каждый поток перед изменением блока памяти блокировал его, например (самый простой вариант) с помощью критичесской секции - EnterCriticalSection, LeaveCriticalSection. 

Автор: The Thing 10.1.2008, 10:52
не слышал о таком... спасибо попробую. Полез читать.

Автор: Cycle 13.1.2008, 03:08
Причем вариант с EnterCriticalSection, LeaveCriticalSection будет быстрее чем с CSemaphore.
Но чтобы ты разобрался и с CSemaphore советую посмотреть члены базового класса CSyncObject: Lock и Unlock.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)