Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / C++ [игнор отключен] [закрыт для гостей] / thread / 6 сообщений из 6, страница 1 из 1
02.05.2013, 03:11
    #38246396
Kup3a
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
thread
Всем привет. Нужна помощь.
В следующей проге всё ломается (насколько я понимаю) в строке создания нового треда. То есть программа компилится и отрабатывает, но в векторе vresult ничего не появляется. Хотя если просто потестить без тредов, то всё прекрасно работает. Поэтому думаю, что какаясегодня-то глупость именно с тредами. Не очень в этом разбираюсь.
Вообще программа - это реализация сортировки слиянием с параллельными процессами. Написана в 12ой студии.
Извините, если доставил неудобоства ненадлежащим оформлением. Опыта маловато.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
#include <iostream>
#include <list>
#include <thread>
#include <mutex>
#include <math.h>
#include <vector>


using namespace std;

template <class T>
void prepare_vector(vector<T> *v)
{
	for (unsigned i = 0; i < v->size(); ++i)
	(*v)[i] = rand() % 100;

}

template <class T>
void print_vector(const vector<T> &v)
{
	for (unsigned i = 0; i < v.size(); ++i)
	cout <<v[i]<<" ";
	cout << endl;
}

template <class T>
vector<T> merge(const vector<T> &v1, const vector<T> &v2)
{
	vector<T> result;

	unsigned x=0, y=0;
	while (x < v1.size() && y < v2.size())
	{
		if (v1[x] < v2[y])
			{
				result.push_back(v1[x]);
				++x;
			}
		else
			{
				result.push_back(v2[y]);
				++y;
		}
	}

	while (x < v1.size())
	{
		result.push_back(v1[x]);
		++x;
	}

	while (y < v2.size())
	{
		result.push_back(v2[y]);
		++y;
	}

	return result;
}

template <class T> 
vector<T> merge_sort(const vector<T> &v)
{
	if (v.size() <= 1)
		return v;

	vector<T> left, right;
	unsigned middle = v.size()/2;

	for (unsigned i=0; i<middle; ++i)
		left.push_back (v[i]);

	for (unsigned i=middle; i<v.size(); ++i)
		right.push_back (v[i]);

	left = merge_sort(left);
	right = merge_sort(right);
	return merge(left,right);
}


class worker {
public:
	void sort(vector<int> &v, vector<int> &vresult) { 
		v=merge_sort(v);
		vresult=merge(vresult,v);
	}
};


int main () {
	vector<int> v(30, 0);
	vector<int> vresult;
	prepare_vector(&v);

	
	print_vector(v);
	
	
	
	 
	
	unsigned N=2;
	std::list<std::thread*>ws; 
	worker w;
	for (unsigned i = 0; i < N; ++i) {
		cout<<"in"<<endl;
		vector<int> vhelp;
		for (unsigned k = i*v.size()/N; k < (i+1)*v.size()/N; ++k) { 
			cout<<"in2"<<endl;
			vhelp.push_back (v[k]);									
			print_vector(vhelp);
		}
		ws.push_back ( new std::thread (&worker::sort, &w, vhelp, vresult));          //думаю, что здесь проблема
		print_vector(vresult);                                                                           //ибо до этого всё хорошо работает
	}

	for ( std::list<std::thread*>::iterator ws_it = ws.begin(); ws_it!=ws.end(); ++ws_it)
		(*ws_it)->join();
	
	print_vector(vresult);
	

	return 0;
}
...
Рейтинг: 0 / 0
02.05.2013, 06:04
    #38246402
White Owl
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
thread
Kup3a ws.push_back ( new std::thread (&worker::sort, &w, vhelp, vresult)); //думаю, что здесь проблема
print_vector(vresult); //ибо до этого всё хорошо работает

Это в смысле "вася, иди наруби дров, давай дрова. Что значит ты еще даже топор не успел взять???"
...
Рейтинг: 0 / 0
02.05.2013, 17:20
    #38246706
Kup3a
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
thread
White Owl,

к принту, который я добавил исключительно, чтобы посмотреть, захожу ли я вообще в цикл, вы придраться смогли, а чего-то конструктивного посоветовать не удосужились? Спасибо, что ещё могу сказать.
...
Рейтинг: 0 / 0
02.05.2013, 19:34
    #38246780
Kup3a
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
thread
Добавил критические секции, чтобы ограничить доступ к vresult. Как выяснилось, всё отрабатывает хорошо за исключением следующего факта: после завершения треда результат в vresult'е не сохраняется. То есть если внутри треда сделать принт, то vresult содержит нужные данные, но сразу после завершения всякий результат пропадает. Подскажите, пожалуйста, в чем косяк.
...
Рейтинг: 0 / 0
02.05.2013, 20:37
    #38246818
Kup3a
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
thread
Проблема была в следующем:
функции sort нужно было передавать указатель на vresult, иначе она только локально изменяла значение вектора. Это моё решение и моя интерпритация проблемы. Всё же буду рад авторитетному мнению.
Спасибо всем, кто морально меня поддерживал, вы мне безумно помогли!
...
Рейтинг: 0 / 0
03.05.2013, 17:33
    #38247288
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
thread
Kup3aWhite Owl,

к принту, который я добавил исключительно, чтобы посмотреть, захожу ли я вообще в цикл, вы придраться смогли, а чего-то конструктивного посоветовать не удосужились? Спасибо, что ещё могу сказать.

Советую конструктивно:
За такое :
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
class worker {
public:
	void sort(vector<int> &v, vector<int> &vresult) { 
		v=merge_sort(v);
		vresult=merge(vresult,v);
	}
};



сразу же надо ... эээ... выгонять из профессии.
Класс на одну функцию?
...
Рейтинг: 0 / 0
Форумы / C++ [игнор отключен] [закрыт для гостей] / thread / 6 сообщений из 6, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]