C++多线程实现静态队列进队、key随机匹配队列值

C++多线程实现静态队列进队、key随机匹配队列值

队列

template <class T>
class MyQueue
{
private:
    int front;
    int rear;
    int maxSize;
    T *array;

public:
    MyQueue(void)
    {
        front = 0;
        rear = 0;
        maxSize = 500;
        array = new T[maxSize];
    }

    ~MyQueue(void)
    {
        delete[] array; /*析构函数释放用户自己分配内存空间并且释放了array指针指向的全部内存空间*/
    }

    int getFront(void)
    {
        return this->front;
    }

    int getRear(void)
    {
        return this->rear;
    }

    T *getArray(void)
    {
        return this->array;
    }

    int getSize(void)
    {
        return this->maxSize;
    }

    //初始化队列满以后,队列进行覆盖式插入元素
    void push(T obj)
    {
        try
        {
            if (isFull())
            {
                front = (front + 1) % maxSize;
            }
            array[rear] = obj;
            rear = (rear + 1) % maxSize;

            EnterCriticalSection(&cs);
            printf("当前:rear=%d,front=%d,obj=%d的小黄人入队\n", rear, front, obj);
            LeaveCriticalSection(&cs);
            //Sleep(10);

        }
        catch (const std::exception &e)
        {
            std::cerr << e.what() << '\n';
        }
    }

    //从对头取元素
    T pop()
    {
        if (!isEmpty())
        {
            try
            {
                T t = array[front];
                front = (front + 1) % maxSize;
                return t;
            }
            catch (const std::exception &e)
            {
                std::cerr << e.what() << '\n';
            }
        }
        return 0;
    }

    //循环队列是否为满
    bool isFull()
    {
        if ((rear + 1) % maxSize == front) //循环队列,队满条件:front==(rear+1)%maxSize
            return true;
        else
            return false;
    }

    //循环队列是否为空
    bool isEmpty()
    {
        if (front == rear)
            return true;
        else
            return false;
    }

    //获取队列当前大小
    int size()
    {
        if (rear > front)
            return rear - front;
        else
            return rear + maxSize + 1 - front;
    }
};

匹配类

template <class T>
class MatchP
{
private:
public:
    MatchP() {}
    ~MatchP(void)
    {
        EnterCriticalSection(&cs);         
        printf("销毁 mp\n");
        LeaveCriticalSection(&cs);

    };

    T doMatch(int key, MyQueue<T> *queue)
    {
        try
        {
            int curFront = queue->getFront();
            int curRear = queue->getRear();
            if (queue->isFull())
            {
                for (int i = 0; i <= curRear; i++)
                {
                    if (queue->getArray()[i] == key)
                    {
                        EnterCriticalSection(&cs);
                        printf("找到 key=%d\n", key);
                        LeaveCriticalSection(&cs);
                        return queue->getArray()[i];
                    }
                }
                for (int i = curFront; i < queue->getSize(); i++)
                {
                    if (queue->getArray()[i] == key)
                    {
                        EnterCriticalSection(&cs);
                        printf("找到 key=%d\n", key);
                        LeaveCriticalSection(&cs);
                        return queue->getArray()[i];
                    }
                }
                EnterCriticalSection(&cs);
                printf("未找到 key=%d\n", key);
                LeaveCriticalSection(&cs);
            }
            else
            {
                for (int i = curFront; i < curRear; i++)
                {
                    if (queue->getArray()[i] == key)
                    {
                        EnterCriticalSection(&cs);
                        printf("找到 key=%d\n", key);
                        LeaveCriticalSection(&cs);
                        return queue->getArray()[i];
                    }
                }
                EnterCriticalSection(&cs);
                printf("未找到 key=%d\n", key);
                LeaveCriticalSection(&cs);
            }
        }
        catch (const std::exception &e)
        {
            std::cerr << e.what() << '\n';
        }
        return 0;
    }
};

入队线程

void *queueLine(void *args)
{
    MyQueue<int> *queue = ((MyQueue<int> *)args);
    int i = 1;
    while (i < 2000)
    {
        queue->push(i);
        i++;
    }
}

匹配线程

void *matchQueue(void *args)
{
    MyQueue<int> *queue = ((MyQueue<int> *)args);
    EnterCriticalSection(&cs);
    printf("接受queue:头:%d,尾:%d\n\n",queue->getFront(),queue->getRear());
    printf("线程2开始\n\n");
    LeaveCriticalSection(&cs);
    int count1 = 0,count2 = 0;
    int j = 1;
    while (j < 2000)
    {
        if (j % 25 == 0)
        {
            MatchP<int> *mp = new MatchP<int>();
            int t = mp->doMatch(j, queue);
            if (t)
            {
                EnterCriticalSection(&cs);
                printf("找到 key=%d\n", j);
                LeaveCriticalSection(&cs);
                count2++;//匹配成功计数
            }
            else
            {
                EnterCriticalSection(&cs);
                printf("未找到 key=%d\n", j);
                LeaveCriticalSection(&cs);
            }

            delete mp;
            count1++;
        }
        j++;
    }
    //delete queue;
    EnterCriticalSection(&cs);
    printf("总共匹配数据:%d\n", count1);
    printf("匹配成功数据:%d\n", count2);
    LeaveCriticalSection(&cs);
}

多线程测试

void test_thread(void)
{
    InitializeCriticalSection(&cs);//临界区初始化
    clock_t startTime, stopTime;
    startTime = clock();
    MyQueue<int> *queue = new MyQueue<int>();
    
    pthread_t tids[2]; //线程id
    int ret = pthread_create(&tids[0], NULL, queueLine, (void *)queue);
    if (ret != 0) //创建线程成功返回0
    {
        cout << "pthread_create error:error_code=" << ret << endl;
    }

    ret = pthread_create(&tids[1], NULL, matchQueue, (void *)queue); //传入到参数必须强转为void*类型,即无类型指针,&i表示取i的地址,即指向i的指针
    if (ret != 0)                                                    //创建线程成功返回0
    {
        cout << "pthread_create error:error_code=" << ret << endl;
    }
    pthread_join(tids[0],NULL);
    pthread_join(tids[1],NULL);

    stopTime = clock();
    printf("共计耗时:%f\n ",(double)(stopTime - startTime) / CLOCKS_PER_SEC);
    while(1);
    pthread_exit(NULL); //等待各个线程退出后,进程才结束,否则进程强制结束,线程处于未终止的状态
    
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在 C++ 中实现线程共享队列可以使用标准库中的 std::queue 和 std::mutex 来实现。具体实现步骤如下: 1. 定义一个模板类,用于表示队列中的元素类型; 2. 在队列类中定义两个 std::queue 成员变量,一个用于存储任务,另一个用于存储等待的线程; 3. 定义一个 std::mutex 对象,用于保护队列的数据; 4. 在队列类中定义 push() 和 pop() 函数,这两个函数需要使用 std::lock_guard<std::mutex> 对象来保护队列的数据; 5. 在 push() 函数中向任务队列中添加任务,并通知等待的线程有新任务加入; 6. 在 pop() 函数中从任务队列中取出一个任务并返回,如果队列为空则等待新任务的到来。 下面是一个简单的多线程共享队列实现: ```c++ #include <queue> #include <mutex> #include <condition_variable> template<typename T> class ThreadSafeQueue { public: ThreadSafeQueue() = default; void push(const T& value) { std::lock_guard<std::mutex> lock(m_mutex); m_queue.push(value); m_condition.notify_one(); } bool pop(T& value) { std::unique_lock<std::mutex> lock(m_mutex); m_condition.wait(lock, [this]{ return !m_queue.empty(); }); if (m_queue.empty()) { return false; } value = m_queue.front(); m_queue.pop(); return true; } private: std::queue<T> m_queue; mutable std::mutex m_mutex; std::condition_variable m_condition; }; ``` 在上面的代码中,我们使用 std::unique_lock<std::mutex> 来保护队列的数据,并使用 std::condition_variable 来通知等待的线程有新任务加入。在 push() 函数中,我们先获取 std::lock_guard<std::mutex> 对象来保护队列的数据,然后向任务队列中添加任务,并通过 m_condition.notify_one() 通知等待的线程有新任务加入。在 pop() 函数中,我们获取 std::unique_lock<std::mutex> 对象来保护队列的数据,并通过 m_condition.wait() 等待新任务的到来。如果队列中有任务,则取出一个任务并返回,否则返回 false。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值