Код:
#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 строки). Получилось очень долго. Что можно сделать, чтоб это исправить