![]() |
|
|
![]()
|
|
| JanryMayers |
|
||||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 71 Регистрация: 11.6.2009 Где: Украина, г. Киев Репутация: нет Всего: нет |
вообщем остановился на таком варианте что скажите?
а вот класс с мьютексом
Это сообщение отредактировал(а) JanryMayers - 26.1.2011, 12:45 |
||||
|
|||||
| azesmcar |
|
|||
![]() uploading... ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 6291 Регистрация: 12.11.2004 Где: Армения Репутация: 3 Всего: 211 |
JanryMayers
Первое, что заметил. Это ошибка, так нельзя. Да, в обычной ситуации функции front() и pop_front() лучше разделять, так-как они выполняют две задачи, к тому же сделать функцию, выполняющую более одной задачи строго-безопасной в отношении исключений довольно сложно. Но это другой случай. В данный момент перед тобой стоит задача получения элемента в многопотоной среде, с таким раскладом ты можешь получить один элемент с помощью функции front(), потом вытащить элемент с помощью функции pop_front(), но нет никакой гарантии, что ты вытащил именно тот элемент, который получил до этого, так-как между двумя вызовами этих функций другой поток может вставить значение в список и ты удалишь этот элемент даже не зная о нем. Функция pop_front() потокобезопасного списка должна возвращать значение, которое она вытащила. Если нужна строгая безопасность исключений (хотя сомневаюсь) возвращай shared_ptr. |
|||
|
||||
| borisbn |
|
||||||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 4875 Регистрация: 6.2.2010 Где: Ростов-на-Дону Репутация: 48 Всего: 135 |
и ещё. Ты проверяешь, например в первом потоке
потом второй поток может влезть и удалить последний элемент, а потом первый поток будет делать
первое, что приходит в голову, это весь код "бизнесс-логики" засунуть в класс Case и защитить его mutex'ом
а код потока станет таким
это мало чем отличается от варианта, где lock вызывается в потоке в самом начале, а unlock в конце, зато все потокобезопасные вещи инкапсулированы от пользователя. вариант, конечно, так себе, но всё должно работать... -------------------- Женщины отличаются от программистов тем, что у них чары состоят из стрингов |
||||||||
|
|||||||||
| JanryMayers |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 71 Регистрация: 11.6.2009 Где: Украина, г. Киев Репутация: нет Всего: нет |
понятно
я вот нашел такую вещь SharedLockable Concept void lock_shared() bool try_lock_shared() bool timed_lock_shared(boost::system_time const& abs_time) void unlock_shared() тут есть и тайм лок можно использовать вместо sleep? а также возможно написать mThread::run(), используя try/catch? |
|||
|
||||
| azesmcar |
|
|||
![]() uploading... ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 6291 Регистрация: 12.11.2004 Где: Армения Репутация: 3 Всего: 211 |
||||
|
||||
| JanryMayers |
|
||||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 71 Регистрация: 11.6.2009 Где: Украина, г. Киев Репутация: нет Всего: нет |
Условие задачи такое
хотел изменяющуюся задержку реализовать sleep и mt19937 генератором... , но думаю есть способ по правильнее, чем этот
почему? может я тебя не правильно понял, но вот тут написано что какое то отношение он все таки имеет, по крайней мере функция time_lock_shared |
||||
|
|||||
| azesmcar |
|
||||||
![]() uploading... ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 6291 Регистрация: 12.11.2004 Где: Армения Репутация: 3 Всего: 211 |
Ну "какое-то" далекое отношение, по сути shared не для этого ввели, а для shared ownership-а, т.е. для timed_lock-а есть TimedLockable. http://www.boost.org/doc/libs/1_32_0/doc/h...epts.TimedMutex. Но все равно, это не то, что тебе нужно.
что такое "с некоторой изменяющейся задержкой"? Мне эта часть непонятна
random-ом что ли? хотя в любом случае это sleep. |
||||||
|
|||||||
| JanryMayers |
|
||||||||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 71 Регистрация: 11.6.2009 Где: Украина, г. Киев Репутация: нет Всего: нет |
да рендом. я его(sleep) так написал
правда в строчке
ошибка, над исправлением которой щас работаю.., но в целом приблизительно так будет выглядеть. в этом классе
говорят, что нельзя выдавать указатель на данные под mutex'ом в этой строчке
какой выход из такой ситуации? Это сообщение отредактировал(а) JanryMayers - 30.1.2011, 18:49 |
||||||||
|
|||||||||
![]()
|
| Правила форума "С/С++: Кроссплатформенное программирование, QT/Gtk+/wxWidgets" | |
|
|
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, Любитель. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | С/С++: Кроссплатформенное программирование, Qt/Gtk+/wxWidgets | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |