powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / thread
6 сообщений из 6, страница 1 из 1
thread
    #38246396
Kup3a
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Всем привет. Нужна помощь.
В следующей проге всё ломается (насколько я понимаю) в строке создания нового треда. То есть программа компилится и отрабатывает, но в векторе 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
thread
    #38246402
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kup3a ws.push_back ( new std::thread (&worker::sort, &w, vhelp, vresult)); //думаю, что здесь проблема
print_vector(vresult); //ибо до этого всё хорошо работает

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

к принту, который я добавил исключительно, чтобы посмотреть, захожу ли я вообще в цикл, вы придраться смогли, а чего-то конструктивного посоветовать не удосужились? Спасибо, что ещё могу сказать.
...
Рейтинг: 0 / 0
thread
    #38246780
Kup3a
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добавил критические секции, чтобы ограничить доступ к vresult. Как выяснилось, всё отрабатывает хорошо за исключением следующего факта: после завершения треда результат в vresult'е не сохраняется. То есть если внутри треда сделать принт, то vresult содержит нужные данные, но сразу после завершения всякий результат пропадает. Подскажите, пожалуйста, в чем косяк.
...
Рейтинг: 0 / 0
thread
    #38246818
Kup3a
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Проблема была в следующем:
функции sort нужно было передавать указатель на vresult, иначе она только локально изменяла значение вектора. Это моё решение и моя интерпритация проблемы. Всё же буду рад авторитетному мнению.
Спасибо всем, кто морально меня поддерживал, вы мне безумно помогли!
...
Рейтинг: 0 / 0
thread
    #38247288
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
6 сообщений из 6, страница 1 из 1
Форумы / C++ [игнор отключен] [закрыт для гостей] / thread
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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