Многопоточное программирование
Добрый день. При попытке написать код, использующий параллельные вычисления, наткнулся на следующую проблему: при создании нескольких потоков каждый из них выполняет одну и ту же функцию, при этом для каждого потока создается некий объект 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()
возникнуть не может?
Спасибо за ответы.