![]() |
|
Модераторы: Daevaorn |
![]()
|
|
| neosapient |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 672 Регистрация: 16.8.2006 Репутация: нет Всего: 4 |
Здравствуйте.
Есть сторонний класс. В класс состоит из фабрики объектов, которые возвращаются в виде указателей на объекты, и набора функций для работы с созданными объектами. Я решил сделать обертку в виде функторов. Суть идеи, при старте программы функтор создает объект через фабрику и запоминает указатель на него. Затем программа работает с функтором как с функцией. При завершение работы программы, функтор удаляет объект. (пример кода написан на коленке)
Всё хорошо, пока программа однопоточная. Но при многопоточной обработке, в состоянии гонки, может быть обращение к одному и тому же объекту obj. В следствии чего поток_1 может уйти в спячку, поток_2 изменить часть данных, затем поток_1 вернется к работе и будет оперировать неверными данными. Самый простой вариант решения проблем с многопоточностью - добавить объект синхронизации в "void operator()". Но хотелось бы найти более элегантный способ без блокировок. В моем случае вижу возможность создать для каждого потока свой объект obj, и заставить прогу работать только с объектом из контекста данного потока. Но вот два вопроса: как заставить операционку вызывать инициализацию init() при старте нового потока, и соответственно, destroy() при останове потока? как указать компилятору, чтобы во время работы потока велась работа с нужным объектом, ассоциированным с этим потоком? |
|||
|
||||
| tzirechnoy |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1173 Регистрация: 30.1.2009 Репутация: 2 Всего: 16 |
Потребовать от вызывающего. Типа, non-reentrant, create object for every thread. |
|||
|
||||
| xvr |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 60 Всего: 223 |
||||
|
||||
| DarthTon |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 106 Регистрация: 7.2.2009 Репутация: нет Всего: 6 |
В С++11 добавили ключевое слово для этого - thread_local
|
|||
|
||||
| NoviceF |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 313 Регистрация: 13.3.2012 Где: Ростов-на-Дону Репутация: нет Всего: 2 |
Для pthread: http://www.opennet.ru/man.shtml?topic=pthr...3&russian=1 pthread_setspecific - set a thread-specific data value Как пользоваться можно почитать у Цирюлик Горошко "Анатомия параллелизма". |
|||
|
||||
![]()
|
| Правила форума "С++:Общие вопросы" | |
|
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |