Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> резервировать память под переменну в каждом потоке, для не блокирующего исполнения 
:(
    Опции темы
neosapient
Дата 27.3.2014, 01:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 672
Регистрация: 16.8.2006

Репутация: нет
Всего: 4



Здравствуйте.

Есть сторонний класс. В класс состоит из фабрики объектов, которые возвращаются в виде указателей на объекты, и набора функций для работы с созданными объектами.

Я решил сделать обертку в виде функторов. Суть идеи, при старте программы функтор создает объект через фабрику и запоминает указатель на него. Затем программа работает с функтором как с функцией. При завершение работы программы, функтор удаляет объект.

(пример кода написан на коленке)
Код



struct foo_t{
    obj_t *obj;

    foo_t()
        : obj(NULL)
   { }

    ~foo_t():
   { }

    void init(factory& f)
    { obj = f.new_obj(); }

    void destroy(factory& f)
    { f.free_obj(obj ); }

    void operator() ()
    {
     // что то делаем с объектом
    }
} foo;

void main ()
{
    factory f;
    foo.init(f);
    for(int i=0; i<100; i++){
        foo();
    }
    foo.destroy(f);
}



Всё хорошо, пока программа однопоточная. Но при многопоточной обработке, в состоянии гонки, может быть обращение к одному и тому же объекту obj. В следствии чего поток_1 может уйти в спячку, поток_2 изменить часть данных, затем поток_1 вернется к работе и будет оперировать неверными данными.

Самый простой вариант решения проблем с многопоточностью - добавить объект синхронизации в "void operator()".
Но хотелось бы найти более элегантный способ без блокировок. В моем случае вижу возможность создать для каждого потока свой объект obj, и заставить прогу работать только с объектом из контекста данного потока.
Но вот два вопроса:
  как заставить операционку вызывать инициализацию init() при старте нового потока, и соответственно, destroy() при останове потока?
  как указать компилятору, чтобы во время работы потока велась работа с нужным объектом, ассоциированным с этим потоком?
PM MAIL   Вверх
tzirechnoy
Дата 27.3.2014, 11:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1173
Регистрация: 30.1.2009

Репутация: 2
Всего: 16



Цитата
  как заставить операционку вызывать инициализацию init() при старте нового потока,


Потребовать от вызывающего. Типа, non-reentrant, create object for every thread.
PM MAIL   Вверх
xvr
Дата 27.3.2014, 12:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 60
Всего: 223



Волшебные слова - TLS

PM MAIL   Вверх
DarthTon
Дата 27.3.2014, 17:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 106
Регистрация: 7.2.2009

Репутация: нет
Всего: 6



В С++11 добавили ключевое слово для этого - thread_local
PM MAIL   Вверх
NoviceF
Дата 7.4.2014, 14:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 313
Регистрация: 13.3.2012
Где: Ростов-на-Дону

Репутация: нет
Всего: 2



Цитата(neosapient @  27.3.2014,  02:18 Найти цитируемый пост)
 как указать компилятору, чтобы во время работы потока велась работа с нужным объектом, ассоциированным с этим потоком? 

Для pthread:
http://www.opennet.ru/man.shtml?topic=pthr...3&russian=1

pthread_setspecific

 - set a thread-specific data value

Как пользоваться можно почитать у Цирюлик Горошко "Анатомия параллелизма".

PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0590 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.