C ++阻塞队列无法轮询当前数据

时间:2015-11-10 20:45:59

标签: c++ multithreading

我遇到了一个奇怪的情况。 我有一个调用C ++代码的Android应用程序。 在C ++代码中,我有两个线程,一个是将数据放入阻塞队列,另一个线程将数据从阻塞队列中取出。 数据结构如下:

typedef struct {
    int len;
    char* data;
} myStruct;

每次我将myStruct的指针放入队列并将此指针从队列中取出。     但有时我会从数据中得到一个非常大的len。就像我在下面显示的日志文件一样:

Put Log Length: 128
Take Log Length: 128
Put Log Length: 171
Take Log Length: 171
Put Log Length: 73
Take Log Length: 73
Put Length: 99
Put Length: 72
Put Length: 124
Take Log Length: 72
......
Take Log Length: 2047249896

我的阻止队列代码如下:

#include "BlockingQueue.h"

template<typename T>
void BlockingQueue<T>::put(const T& task)
{
    std::unique_lock<std::mutex> lock(mtx);
    q.push_back( task );
    isEmpty.notify_all();
}

template<typename T>
T BlockingQueue<T>::take()
{
    std::unique_lock<std::mutex> lock(mtx);
    isEmpty.wait(lock, [this]{return !q.empty(); });
    T front( q.front() );
    q.pop_front();
    return front;
}

template<typename T>
bool BlockingQueue<T>::empty()
{
    std::unique_lock<std::mutex> lock(mtx);
    return q.empty();
}

0 个答案:

没有答案