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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Мультитрединг: нити и память 
:(
    Опции темы
prothet
Дата 4.11.2014, 21:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Добрый вечер. При попытке написать код, использующий параллельные вычисления, наткнулся на следующую проблему: при создании нескольких потоков каждый из них выполняет одну и ту же функцию, при этом для каждого потока создается некий объект task_. Ниже приведен кусок заголовочного файла с некоторыми произвольными классами: class_1, class_2, class_3. В нем присутствует класс thread_pool, который создает нити и сразу запускает на них функцию worker_thread.

Код

class task_params
{
public:
    float a;
    class_1 b;
    class_2* c;
    task_params::task_params(float a_, class_1 b, class_2* c);
    {
        a = a_;
        b = b_;
        c = c_;
    }
};

class task
{
public:
    class_3* layer = new class_3;
    task_params params;
    void run()
    {
        layer->layer_run(params);
    }
};

class thread_pool
{
public:
    boost::lockfree::queue<task> queue;

    unsigned const thread_count = 2;

    class_3* pool_layer = new class_3;
    
    vector<thread> threads;
    
    //конструктор
    thread_pool(class_3* layer_from_main)
    {
            done = false;

            task our_task;

            //////////////
            // Блок заполнения queue данными объекта layer_from_main,
            // передаваемового из вне
            //////////////

            for (unsigned i = 0; i < thread_count; i++)
                {
                    threads.push_back(thread(&thread_pool::worker_thread, this));
                }
            
            for (unsigned i = 0; i < thread_count; i++)
                {
                    if (threads[i].joinable())
                    {
                        threads[i].join();
                    }
                }
    }

    void worker_thread()
    {
        task task_;

        while (!done)
        {
            if (queue.pop(task_))
            {
        
                task_.run();

                /////////////
                // Блок добавления в pool_layer данных из
                // текущего task_.layer
                /////////////

                cout << "thread_run" << endl;
                cout << "thread = " << this_thread::get_id() << endl;
                
                cout << "adress this task_ : " << &task_ << endl
                    << "adress result from this task_ : " << &task_.layer->states << endl;
                cout << "-----------------" << endl;
            }

            else
            {
                this_thread::yield();
                done = true;
            }
        }
    }
};


Необходимые расчеты проводятся в методе layer_run(params), который "запускается" в task::run(){ layer->layer_run(params) }. В layer_run(params) нити не обращаются к общим данным вообще.

На картинке ниже схематичное изображение процесса запуска нитей:
user posted image

Сам вопрос заключается в следующем: верно ли, что для каждой нити в цикле в worker_thread создается собственный объект task_, который используется только данной нитью? Если это так, что подтверждает картинка ниже - скрин консоли, где выведены id нити, адрес task_, создаваемого этой нитью, и адрес члена result данного task_, почему адреса result в разных нитях, и соответственно разных task_, одинаковые?
user posted image

И ещё вопрос: если при запуске task_.run() в каждой нити, дальше при расчетах нити принципиально не обращаются к общим данным, то верно ли, что никаких "многопоточных" проблем внутри task_.run() возникнуть не может? 

Спасибо за ответы.
PM MAIL   Вверх
xvr
Дата 5.11.2014, 12:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



А где заполнение  boost::lockfree::queue<task> queue;? Похоже корень проблем там.

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


Эксперт
****


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

Репутация: 22
Всего: 135



Цитата(prothet @  4.11.2014,  21:43 Найти цитируемый пост)
class task
{
public:
    class_3* layer = new class_3;
...

А почему его никто не удаляет ? А если ты для краткости выкинул удаление, то при копировании такого класса (а копирование будет, т.к. он лежит в queue) будут проблемы



--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
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.0726 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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