c++ - 如何使循环队列线程安全?

标签 c++ multithreading queue

所以我的 Enqueue 和 Dequeue 函数如下。我如何利用我所拥有的并使其成为线程安全的?我考虑过使用 Windows.h 中的互斥锁,但如果可能的话,我不想将我的程序限制为仅限 Windows。

void Queue::Enqueue(int num){
    //increase recorded size
    size++;
    //stick in num
    numbers[nextSpace] = num;
    //find the next available space
    nextSpace = (++nextSpace) % maxSize;
}

int Queue::Dequeue(){
    int temp;
    temp = items[curSpace];
    curSpace = (++curSpace) % maxSize;
    size--;
    return temp;
}

最佳答案

您可以引用这段代码(使用 pthreads):

#include<pthread.h> 
#define DEFAULT_SIZE 100
class circularQueue{
 private:
    int *m_queue;
    int p_head;
    int p_tail;
    int m_cap;
    pthread_mutex_t mp = PTHREAD_MUTEX_INITIALIZER; 
    public:
        circularQueue(int size)
        {
            /*in case invalid input*/
            if(size<0)
                size = DEFAULT_SIZE ;

            m_queue = new int[size];
            p_head = 0;
            p_tail = -1;
            m_cap = 0;
            pthread_mutex_init(&mp,NULL);
        }

        bool enqueue(int x)
        {
            bool res= false;
            p_thread_mutex_lock(&mp);
            /*queue is full*/
            if(m_cap == size)
            {
                res = false;
            }
            else
            {
                m_queue[(++p_tail)%size)] = x;
                ++m_cap;
                res = true;
            }
            p_thread_mutex_unlock(&mp);
            return res;
        }
        int dequeue()
        {
            int res=0;

            pthread_mutex_lock(&mp);
            /*empty queue*/
            if(m_cap == 0)
            {    
                throw("empty queue!");
                pthread_mutex_unlock(&mp);
            }
            else{
                res = m_queue[p_head];    
                p_head = (p_head+1)%size;
            }
            pthread_mutex_unlock(&mp);
            return res;
        }    
        ~virtual circularQueue()
        {
            delete[] m_queue;
            m_queue = NULL;
            pthread_mutex_destroy(&mp);
        }
}

关于c++ - 如何使循环队列线程安全?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15751410/

相关文章:

java - 使用 Spring 事务的 JUnit 多线程测试

php - 如何在 PHP 中为 future 的发布日期安排/排队内容?

c++ - 如何从类队列中获取 'push' 和 'pop'?

php - Laravel队列-在特定条件下防止作业重试

c++ - 如何将此数学方程式写入 C++

java - Android Bump Api Network 主线程异常

java - 同步块(synchronized block)是否会触发数组的完整内存栅栏?

c++ - 我在 Xcode 中使用 C++11 时遇到一些问题

c++ - 使用 Auto 时在派生类中使用虚拟析构函数强制复制构造函数

c++ - 对自定义对象的 vector 进行排序