Многопоточное программирование

Рейтинг: 2Ответов: 0Опубликовано: 04.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) нити не обращаются к общим данным вообще.

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

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

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

Спасибо за ответы.

Ответы

Ответов пока нет.