Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
Форум программистов > C/C++: Системное программирование и WinAPI > Копирование объектов в Multithreading |
Автор: exploys 20.10.2010, 01:22 | ||
Упрощенный пример
И собственно два вопроса: 1. Как лучше сделать чтобы при objectA2 = objectA1; копировались не указатели на MyObjectsB, а создавалась собственная копия MyObjectsB для objectA2. Перегрузкой оператора =, отдельной функцией или как-то ещё. 2. При условии, что функция void MyFunc(void) будет вызываться из множества потоков что следует исправить в коде? Подскажите что исправить или посоветуйте литературу, а если и то и то, то вообще будет шикарно. |
Автор: Rad87 20.10.2010, 08:15 |
вероятно, описать все это в конструкторе копирования |
Автор: xvr 20.10.2010, 09:05 | ||||
Оператор присваивания и конструктор копирования
Целиком зависит от содержимого этой функции (т.е. от того самого оператора присваивания и конструктора копирования). Самый универсальный способ - критическая секция (но и самый не эффективный по производительности) |
Автор: GremlinProg 20.10.2010, 10:34 |
ну да, вот, кстати xvr тут где-то приводил вариант прокси с критической секцией, удобнее похоже и не придумать а вот по производительней можно использовать дроссель из семафора, который будет перекрываться полностью при изменении каких-либо указателей (критические изменения в объекте), или просто приоткрываться для определенного потока, если надо его только скопировать единственное, что тут надо предусмотреть, чтобы полное перекрытие было защищено критической секцией, чтобы несколько потоков не могли одновременно вносить критические изменения в объект если сильно интересно, то почитать об этом можно у Харта, например: http://www.williamspublishing.com/Books/5-8459-0879-5.html |
Автор: GremlinProg 20.10.2010, 22:33 |
1. нажать "поиск" 2. ввести ключевое слово proxy 3. ввести в "фильтр по имени пользователя" xvr 4. нажать "найти" |
Автор: xvr 20.10.2010, 23:39 |
http://forum.vingrad.ru/index.php?showtopic=303899&view=findpost&p=2173775 |
Автор: exploys 29.11.2010, 10:45 |
Спасибо. Классная штука. А при перегрузке оператора = обязательно придется прописывать копирование каждой переменной или можно как-то их скопом скопировать? (а затем уже с нужными объектами провести глубокое копирование) |
Автор: xvr 29.11.2010, 13:20 | ||
|
Автор: exploys 1.12.2010, 11:33 | ||
Я тоже подумал, что это некий костыль. А адекватного способа так и не нашел. Т.е. либо полностью отдавать на откуп компилятору который почленно произведет поверхностное копирование. Либо делать глубокое, но уже самому почленно все прописывать. Оба варианта не всегда подходят. Как вариант использовать умные указатели и контейнеры. |
Автор: GremlinProg 1.12.2010, 11:37 | ||
адекватный - не переписывать оператор = в этом случае все данные копируются почленно автоматом Добавлено @ 11:45 если надо совместить почленное и глубокое копирование, то используется наследование:
в классе A не должен быть переписан оператор = Добавлено @ 11:50 кстати, тема подходит больше для раздела http://forum.vingrad.ru/forum/c-c++general-questions.html, перенести? хотя, ладно, раз Multithreading, пусть тут живет |
Автор: exploys 10.12.2010, 17:36 |
Спасибо, то что нужно ![]() |