• 数据结构与算法4 — 高并发栈


    尊重作者劳动成果,转载请注明出处,谢谢!

    1. concurrentStack.h

    #ifndef concurrentStack_H
    #define concurrentStack_H
    
    #include "types.h"
    #include <pthread.h>
    
    //栈节点
    typedef struct stackNode
    {
        void *data;             //数据
        struct stackNode *next; //下一节点
    } StackNode;
    
    //高并发栈,采用链表的实现方式,提供后进先出的数据访问方式,支持多线程的安全访问,支持多种数据类型,包括:int、struct等
    typedef struct
    {
        StackNode *top;       //头节点(栈顶,NULL表示栈为空)
        size_t dataSize;      //数据大小(字节)
        size_t size;          //栈大小
        pthread_mutex_t lock; //栈锁
    } ConcurrentStack;
    
    //定义该宏可以直观的看出栈元素的数据类型,比如:ConcurrentStack(int)
    #define ConcurrentStack(type) ConcurrentStack
    
    #ifdef __cplusplus
    extern "C"
    {
    #endif
        boolean concurrentStack_init(ConcurrentStack *stack, size_t dataSize);
        void concurrentStack_free(ConcurrentStack *stack);
        void concurrentStack_clear(ConcurrentStack *stack);
        size_t concurrentStack_length(ConcurrentStack *stack);
        boolean concurrentStack_empty(ConcurrentStack *stack);
        boolean concurrentStack_push(ConcurrentStack *stack, const void *data);
        boolean concurrentStack_pop(ConcurrentStack *stack, void *data);
        void *concurrentStack_top(ConcurrentStack *stack, void *data);
    #ifdef __cplusplus
    }
    #endif
    
    #endif

    2. concurrentStack.c

    #include "concurrentStack.h"
    #include <string.h>
    #include <stdlib.h>
    
    //创建栈节点
    static StackNode *stackNode_create(const void *data, size_t dataSize)
    {
        StackNode *node = (StackNode *)malloc(sizeof(StackNode));
        if (node == NULL)
            return NULL;
    
        memset(node, 0, sizeof(StackNode));
        node->data = malloc(dataSize);
        if (node->data == NULL)
        {
            free(node);
            return NULL;
        }
    
        memcpy(node->data, data, dataSize);
        node->next = NULL;
        return node;
    }
    
    //释放栈节点
    static void stackNode_free(StackNode *node)
    {
        if (node == NULL)
            return;
    
        node->next = NULL;
        if (node->data != NULL)
        {
            free(node->data);
            node->data = NULL;
        }
    
        free(node);
    }
    
    //初始化
    boolean concurrentStack_init(ConcurrentStack *stack, size_t dataSize)
    {
        if (stack == NULL || dataSize <= 0)
            return False;
    
        pthread_mutex_init(&stack->lock, NULL);
        stack->top = NULL;
        stack->size = 0;
        stack->dataSize = dataSize;
        return True;
    }
    
    //释放内存
    void concurrentStack_free(ConcurrentStack *stack)
    {
        if (stack == NULL)
            return;
    
        concurrentStack_clear(stack);
        stack->dataSize = 0;
        pthread_mutex_destroy(&stack->lock);
    }
    
    //清空栈
    void concurrentStack_clear(ConcurrentStack *stack)
    {
        if (stack == NULL)
            return;
    
        pthread_mutex_lock(&stack->lock);
        StackNode *top;
        while (stack->top != NULL)
        {
            top = stack->top;
            stack->top = top->next;
            stackNode_free(top);
        }
    
        stack->top = NULL;
        stack->size = 0;
        pthread_mutex_unlock(&stack->lock);
    }
    
    //获取栈长度
    size_t concurrentStack_length(ConcurrentStack *stack)
    {
        if (stack == NULL || stack->top == NULL)
            return 0;
    
        return stack->size;
    }
    
    //判断栈是否为空
    boolean concurrentStack_empty(ConcurrentStack *stack)
    {
        if (stack == NULL)
            return True;
    
        return stack->top == NULL ? True : False;
    }
    
    //入栈
    boolean concurrentStack_push(ConcurrentStack *stack, const void *data)
    {
        if (stack == NULL)
            return False;
    
        StackNode *node = stackNode_create(data, stack->dataSize);
        if (node == NULL)
            return False;
    
        pthread_mutex_lock(&stack->lock);
    
        node->next = stack->top;
        stack->top = node;
        stack->size++;
    
        pthread_mutex_unlock(&stack->lock);
        return True;
    }
    
    //出栈
    boolean concurrentStack_pop(ConcurrentStack *stack, void *data)
    {
        if (stack == NULL)
            return False;
    
        pthread_mutex_lock(&stack->lock);
    
        if (concurrentStack_empty(stack)) //栈空
        {
            pthread_mutex_unlock(&stack->lock);
            return False;
        }
    
        if (data != NULL)
            memcpy(data, stack->top->data, stack->dataSize);
    
        StackNode *top = stack->top;
        stack->top = top->next;
        stack->size--;
        stackNode_free(top);
    
        pthread_mutex_unlock(&stack->lock);
        return True;
    }
    
    //获取栈顶元素指针
    void *concurrentStack_top(ConcurrentStack *stack, void *data)
    {
        if (stack == NULL)
            return NULL;
    
        pthread_mutex_lock(&stack->lock);
    
        if (concurrentStack_empty(stack)) //栈空
        {
            pthread_mutex_unlock(&stack->lock);
            return NULL;
        }
    
        void *top = stack->top->data;
        if (data != NULL)
            memcpy(data, top, stack->dataSize);
    
        pthread_mutex_unlock(&stack->lock);
        return top;
    }
  • 相关阅读:
    禅知Pro 1.6 前台任意文件读取 | 代码审计
    wpa破解学习实践
    Natural Merge Sort(自然归并排序)
    [转]the service mysql57 failed the most recent status[/br]mysql57 was not found解决办法
    《Metasploit魔鬼训练营》第七章学习笔记
    Adobe阅读器漏洞(adobe_cooltype_sing)学习研究
    MS10_087漏洞学习研究
    第三方插件渗透攻击之KingView
    《Metasploit魔鬼训练营》虚拟环境搭建中网络配置的一些问题
    KingView 6.53漏洞学习研究
  • 原文地址:https://www.cnblogs.com/chenyuxin/p/15215093.html
Copyright © 2020-2023  润新知