![]() |
|
Модераторы: Daevaorn |
![]()
|
|
| JanryMayers |
|
||||||||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 71 Регистрация: 11.6.2009 Где: Украина, г. Киев Репутация: нет Всего: нет |
Доброго времени, всем)
Запутался. Вопрос такой: как реализовать в моем случае потокобезопасный синглтон либо нужен ли он в моем случае вообще и как обойтись без него? Задача: Клиенты отправляют запросы
они добавляются в мапу очередей, вот .h очереди
собственно проблема в том что клиент отправляет запрос... я сделал очердь шаблоном, что бы данные туда могли поступать различного типа, соответственно о типе данных знает только клиент и сервер( вот тут тоже не уверен) когда пытается их изъять и обработать. По этому клиент отправляя запрос создает класс QueueWithPriority с нужными списком аргументов для шаблона. Вообщем помогите как тут правильно сделать? ещё нашел интересную статью, там ход рассуждений сводится к
не знаю подойдет он к моей задаче или нет? вот часть main.cpp
|
||||||||
|
|||||||||
| azesmcar |
|
|||
![]() uploading... ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 6291 Регистрация: 12.11.2004 Где: Армения Репутация: 81 Всего: 211 |
||||
|
||||
| JanryMayers |
|
||||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 71 Регистрация: 11.6.2009 Где: Украина, г. Киев Репутация: нет Всего: нет |
не уверен..., просто предполагаю что задачу нужно решать так, но если такой способ содержит грубые ошибки или может привести к низкой производительности или ещё по каким то серьёзным обстоятельствам не являться корректным, то прошу предложить более разумную на ваш взгляд реализацию.
можете показать на примере |
||||
|
|||||
| azesmcar |
|
|||
![]() uploading... ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 6291 Регистрация: 12.11.2004 Где: Армения Репутация: 81 Всего: 211 |
если как вариант можно создать singleton где нибудь в функции main, а потом его использовать, то я думаю именно так и нужно поступить и не усложнять себе жизнь, если же объект большой, его инициализация возможно не понадобиться вообще или что-то еще в этом роде, тогда можно сделать ленивую инициализацию (т.е. создавать обьект singleton-а при первом обращении), но это уже вызывает проблему в многопоточной среде. Да, конечно.
Это сообщение отредактировал(а) azesmcar - 9.8.2011, 21:06 |
|||
|
||||
| JanryMayers |
|
||||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 71 Регистрация: 11.6.2009 Где: Украина, г. Киев Репутация: нет Всего: нет |
спасибо за пример.
на счет синглтона... я решил сделать так
вот, а в main.cpp
что скажете на этот счет? думаю после этого все потоки которые будут вызывать getInstance будут получать ссылку, на существующий объект. при попытке сбилдить выдает одну ошибку... которую не могу победить, есть мысли? 1>Client.obj : error LNK2001: unresolved external symbol "public: static class boost::mutex QueueWithPriority<unsigned char,struct tagTDATA>::_mutex" (?_mutex@?$QueueWithPriority@EUtagTDATA@@@@2Vmutex@boost@@A) 1>F:\Projects\TestQWP_Console\Debug\TestQWP_Console.exe : fatal error LNK1120: 1 unresolved externals |
||||
|
|||||
| Qu1nt |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 602 Регистрация: 13.1.2007 Репутация: 1 Всего: 50 |
Потокобезопасный в С++0x. |
|||
|
||||
| JanryMayers |
|
||||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 71 Регистрация: 11.6.2009 Где: Украина, г. Киев Репутация: нет Всего: нет |
Qu1nt, а можешь описать на моем примере?
у меня получается так
а когда я вызываю вот этот участок кода
queueWithPriority - не определено, то есть через watch там error symbols not found Что не так? |
||||
|
|||||
| JanryMayers |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 71 Регистрация: 11.6.2009 Где: Украина, г. Киев Репутация: нет Всего: нет |
Собрал все в кучу)
Господа) просьба принять на проверку)... Может можна как то упростить? или укоротить такие длинные надписи как вот эта std::map<priority, std::queue<TypeData>>::iterator queueIterator = instance()->queueWithPriority.find(_priority);
Это сообщение отредактировал(а) JanryMayers - 11.8.2011, 04:03 |
|||
|
||||
| borisbn |
|
||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 4875 Регистрация: 6.2.2010 Где: Ростов-на-Дону Репутация: 22 Всего: 135 |
целых два варианта 1.
2. (при наличие C++0x)
а ещё лучше их объединить: сделать typedef и использовать auto -------------------- Женщины отличаются от программистов тем, что у них чары состоят из стрингов |
||||
|
|||||
| JanryMayers |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 71 Регистрация: 11.6.2009 Где: Украина, г. Киев Репутация: нет Всего: нет |
Да тут ещё проблемка возникла
с функцией extract
как правильно это обработать, по следующей логике... сервер изымает(считывает и удаляет) из очереди нужный запрос и принтит его может разделить эту функцию на две первая будет возвращать запрос для принта, а вторая после того как запрос обработается удалять? |
|||
|
||||
| asmdzen |
|
||||
![]() ![]() ![]() Профиль Группа: Участник Сообщений: 345 Регистрация: 28.11.2010 Репутация: нет Всего: 5 |
может так?
тогда этого не должно быть и не лучше ли чтоб этот requestExtract передавался как параметр функции? после использования кто будет удалять то на что он указывает?
будете искать дважды ) |
||||
|
|||||
| JanryMayers |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 71 Регистрация: 11.6.2009 Где: Украина, г. Киев Репутация: нет Всего: нет |
Вообщем осталась одна проблема.
если клиентов больше 4х то после срабатывания остановки процесса... программа какбэ зависает, то есть не может завершиться, тк что то ей не даёт этого сделать. У кого нибудь есть предположения от чего это и как починить? Это сообщение отредактировал(а) JanryMayers - 14.8.2011, 21:43 |
|||
|
||||
| azesmcar |
|
|||
![]() uploading... ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 6291 Регистрация: 12.11.2004 Где: Армения Репутация: 81 Всего: 211 |
этот код практически ни о чем не говорит. что делает client->stop(), server->stop()? |
|||
|
||||
![]()
|
| Правила форума "С++:Общие вопросы" | |
|
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |