Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 04.11.2014, 21:29   #1
prothet
Новичок
Джуниор
 
Регистрация: 04.11.2014
Сообщений: 1
По умолчанию Мультитрединг: память и нити

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

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

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

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

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

Последний раз редактировалось prothet; 04.11.2014 в 21:32.
prothet вне форума Ответить с цитированием
Старый 05.11.2014, 00:04   #2
f.hump
C/C++, Asm
Участник клуба
 
Аватар для f.hump
 
Регистрация: 02.03.2010
Сообщений: 1,323
По умолчанию

а это нормально, что layer инициализируется в декларации?

может компилятор его при таком раскладе его статиком считает, и может даже конст.
f.hump вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Нити Queit72ru Помощь студентам 0 11.03.2012 11:11
Построить ломаную линию по заданныи вершинам. Вершины указываются с клавиатуры по «методу резиновой нити». HollywoodStar Паскаль, Turbo Pascal, PascalABC.NET 0 17.12.2011 14:36
Нити в процессе JustLikeFar Win Api 6 23.08.2009 17:32
В среде Delphi составить программу (процесс), который паралельно запускает два потока (нити) metamfetamin Помощь студентам 9 06.11.2007 15:26
Потоки и их "нити" Air Win Api 7 15.05.2007 20:17