多线程堆栈,向量下标超出范围

时间:2019-07-17 08:04:21

标签: c++ multithreading stack push

我正在编写此多线程类以将std :: vector用作堆栈。 我不知道为什么它不起作用。

如果线程弹出,并且堆栈中没有元素,则应等待直到新的推送完成。

void StackAdder::addToStack(std::wstring s)
{
    insertLock.lock();
    stack[laststring] = s;
    laststring++;
    insertLock.unlock();

    cv.notify_all();
}

std::wstring StackAdder::removeFromStack()
{
    std::unique_lock<std::mutex> ul(m);
    cv.wait(ul, [this]() { return (numstring > 0); });

    std::wstring s;
    insertLock.lock();
    laststring--;
    s = stack.at(laststring);
    insertLock.unlock();

    return s;
}

在这里声明:


class StackAdder
{
public:
    StackAdder();
    ~StackAdder();
    void addToStack(std::wstring s);
    std::wstring removeFromStack();
private:
    std::vector<std::wstring> stack;
    int laststring;
    int numstring;

    std::condition_variable cv;
    std::mutex m;
    std::mutex insertLock;
};

运行该程序,出现异常“向量下标超出范围”

1 个答案:

答案 0 :(得分:0)

由于上面的评论,我知道向量使用通过push_back方法更新的大小和容量。 为了避免这种情况,我在构造函数中使用了reserve和resize方法。

   StackAdder::StackAdder()
    {
    laststring = 0;
    numstring = 0;
    stack.reserve(100);
    stack.resize(100);
    }