| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > 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 а там кроме конструктора у него ничего нет... меня это ввело в заблуждение. Вообще посмотрел на такие вещи как 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. |