Olá.
Estou começando a estudar mutexes em C++. Fiz um programa que inclui elementos em uma lista simplesmente encadeada, ordena e mostra o tempo que levou esta ordenação.
Gostaria de usar múltiplos threads para fazer essa ordenação (podendo escolher quantos, na linha std::thread threads[10];), e variando o número de elementos que a lista possui, a fim de comparar os tempos de execução, com diferentes elementos/diferentes threads. Fiz isto no main. Estou fazendo certo? Não vejo quase nenhuma diferença entre os tempos, nos testes.
Segue abaixo o código. Desde já agradeço pela ajuda e atenção.
/*
* Programa C++ para Ordenar Lista Simplesmente Encadeada
*/
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <chrono>
#include <thread>
#include <mutex>
#define MAX 1000 //número de elementos da lista
std::mutex mtx; // mutex para seção crítica
using namespace std;
/*
* Declaração do Nodo
*/
struct nodo
{
int info;
struct nodo *proximo;
}*inicio;
/*
* Declaração das Classes
*/
class lista_simples
{
public:
nodo* cria_nodo(int);
void insere_inicio();
void ordena();
void exibe();
lista_dupla()
{
inicio = NULL;
}
};
/*
* Main :contém Menu de Opções
*/
main()
{
int opcao, nodes, elemento, posicao, i;
lista_simples ls;
inicio = NULL;
std::thread threads[10]; //número de threads utilizados
std::chrono::time_point<std::chrono::system_clock> inicio, fim;
std::chrono::duration<double> tempoDecorrido;
while (1)
{
cout << endl <<"---------------------------------------" << endl;
cout << endl << "Ordenacao Lista Simplesmente Encadeada" << endl;
cout << endl << "--------------------------------------" << endl;
cout << "1. Inserir nodos no Inicio" << endl;
cout << "2. Ordena Lista Encadeada" << endl;
cout << "3. Sair " << endl;
cout << "\nEntre com a opcao : ";
cin >> opcao;
switch(opcao)
{
case 1:
cout << "\nInserindo nodos no Inicio " << endl;
ls.insere_inicio();
//ls.exibe();
cout << endl;
break;
case 2:
cout << "\nOrdena Lista Encadeada: " << endl;
inicio = std::chrono::system_clock::now();
mtx.lock();
ls.ordena();
//ls.exibe();
mtx.unlock();
fim = std::chrono::system_clock::now();
tempoDecorrido = fim - inicio;
cout << "\n\n\nCalculado em: " << tempoDecorrido.count() << "s" << endl;
cout << endl;
break;
case 3:
cout << "Sair" << endl;
exit(1);
break;
default:
cout << "Opcao Errada" << endl;
}
}
}
/*
* Cria nodo - Cria Lista Simplesmente Encadeada
*/
nodo *lista_simples::cria_nodo(int valor)
{
struct nodo *temp, *s;
temp = new(struct nodo);
if (temp == NULL)
{
cout << "Memoria nao Alocada" << endl;
return 0;
}
else
{
temp->info = valor;
temp->proximo = NULL;
return temp;
}
}
/*
* Insere elementos no início
*/
void lista_simples::insere_inicio()
{
int i,valor;
struct nodo *temp, *p;
for (i=1; i <=MAX; i++)
{
temp = cria_nodo(valor);
valor = rand() % (MAX * 10);
if (inicio == NULL)
{
inicio = temp;
inicio->proximo = NULL;
}
else
{
p = inicio;
inicio = temp;
inicio->proximo = p;
}
}
cout << "\nElementos inserido no Inicio" << endl;
}
/*
* Ordena Lista Simplesmente Encadeada
*/
void lista_simples::ordena()
{
struct nodo *ptr, *s;
int valor;
if (inicio == NULL)
{
cout << "A Lista esta vazia!"<<endl;
return;
}
ptr = inicio;
while (ptr != NULL)
{
for (s = ptr->proximo;s !=NULL;s = s->proximo)
{
if (ptr->info > s->info)
{
valor = ptr->info;
ptr->info = s->info;
s->info = valor;
}
}
ptr = ptr->proximo;
}
}
/*
* Exibe elementos da Lista
*/
void lista_simples::exibe()
{
struct nodo *temp;
if (inicio == NULL)
{
cout << "A Lista esta vazia!" << endl;
return;
}
temp = inicio;
cout << "\nElementos da Lista: " << endl;
while (temp != NULL)
{
cout << temp->info << " ";
temp = temp->proximo;
}
cout << "NULL" << endl;
}