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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 04.04.2019, 14:09   #1
Tpai
 
Регистрация: 09.06.2018
Сообщений: 9
Сообщение Долгое выделение памяти под переменные типа thread

Код:
#include "stdafx.h"
#include <iostream>
#include <vector>
#include <array>
#include <thread>
#include <cmath>
#include <mutex>
#include <ctime>
#include <chrono>
using namespace std;
template <class T> class my_array;
template <class T>
void vn(int k, int n, my_array<T> * th);
template <class T> class my_array {
	vector <T> veca;
	int adt;
	int gr;
	mutex g;
	int * adt2;
	thread * te;
	int logan;
public:
	my_array(vector<T> veca1) {
		veca = veca1;
		gr = veca.size();
		adt = gr / 2 - 1;
		logan = log2(adt);
		adt2 = new int[logan];
		for (int adt3 = adt, i = 0; adt3 > 1; adt3 /= 2, i++) {
			adt2[i] = adt3;
		}
	};
	friend void vn <>(int k, int n, my_array<T> * th);
	void shelly(void) {
		int i = 0;
		int adt1 = adt;
		int j;
		int k;
		te = new thread[adt - 1];
		auto start = chrono::steady_clock::now();
		for (j = adt1 / 2 + adt1 % 2, k = 1; adt1 > 1; adt1 /= 2, j += adt1 / 2 + adt1 % 2, k++) {//исправить
			for (; i < j; i++) {
				te[i] = thread(vn<T>, adt - i - 1, k, this);
			}
		}
		auto end = chrono::steady_clock::now();
		int elapsed_seconds = chrono::duration_cast<chrono::microseconds>(end - start).count();
		thread tr (vn<T>, 0, k - 1, this);
		for (int wq = 0; wq < adt - 1; wq++) {
			te[wq].join();
		}
		tr.join();
		delete[] te;
		k = 1;
		T t;
		for (int i = k; i < gr; i++)
		{
			t = veca[i];
			for (j = i; j >= k; j -= k)
			{
				if (t < veca[j - k])
					veca[j] = veca[j - k];
				else
					break;
			}
			veca[j] = t;
		}

	};
	void schell(void) {
		int i, j, k;
		T t;
		for (k = gr / 2; k > 0; k /= 2)
			for (i = k; i < gr; i++)
			{
				t = veca[i];
				for (j = i; j >= k; j -= k)
				{
					if (t < veca[j - k])
						veca[j] = veca[j - k];
					else
						break;
				}
				veca[j] = t;
			}
	};
	~my_array() {
		delete[] adt2;
	};
};
template <class TT> void vn(int b, int n, my_array<TT> * th)
{
	int j, i;
	TT t;
	int k = th->adt;
	for (i = k + b; i < th->gr; i += k)
	{
		t = th->veca[i];
		for (j = i; j >= k; j -= k)
		{
			if (t < th->veca[j - k])
				th->veca[j] = th->veca[j - k];
			else
				break;
		}
		th->veca[j] = t;
	}
	th->g.lock();
	th->adt2[0]--;
	th->g.unlock();
	k /= 2;
	for (int er = 1; er < n; k /= 2, er++) {
		while (1) {
			th->g.lock();
			if (th->adt2[er - 1] == 0) {
				th->g.unlock();
				break;
			}
			th->g.unlock();
		}
		for (i = k + b; i < th->gr; i += k)
		{
			t = th->veca[i];
			for (j = i; j >= k; j -= k)
			{
				if (t < th->veca[j - k])
					th->veca[j] = th->veca[j - k];
				else
					break;
			}
			th->veca[j] = t;
		}
		th->g.lock();
		th->adt2[er]--;
		th->g.unlock();
	}
}
int main()
{
	vector <double> oba = { 9.8, 77.6, 8.33, 4.77, 8.77, 5.94, 4.11, 3.654, 666.888, 7.5, 4.5, 8.9, 7.8, 22.0, 8.4, 4.8, 2.0, 7.5, 7.8, 8.0, 4.1, 7.9, 73.88, 39.66, 97.55, 6754.8 };
	my_array <double> jhu(oba);
	jhu.shelly();
	return 0;
}
В функции shelly я измерил время выделения памяти под переменные типа thread (где-то начиная с 40 строки). Получилось очень долго. Что можно сделать, чтоб это исправить
Tpai вне форума Ответить с цитированием
Ответ


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

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
[Assembler] Matrix rd H*W*4 ; выделение памяти под матрицу (строки идут друг за другом) rd - это сколько памяти выделяется? Дмитрийййй Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 11 10.10.2018 12:13
Очень долгое освобождение динамически выделенной памяти Rangok Общие вопросы C/C++ 40 01.08.2012 22:57
Открыть файл с расширением .pas ми подсчитать сколько в памяти занимают переменные типа Integer бипбип Помощь студентам 3 16.05.2012 22:10
Closehandle (thread)-ошибка чтения памяти. googl Win Api 8 02.04.2012 09:43
Thread creation error - Недостаточно памяти RealSwift Общие вопросы Delphi 1 06.07.2008 12:27