Ir ao conteúdo
  • Cadastre-se
André Desessards Jardim

C++ Uso de Mutex (lock/unlock) em lista encadeada

Recommended Posts

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;
}

Compartilhar este post


Link para o post
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisar ser um membro para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora





Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas publicações sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×