【问题标题】:Multithreading stack, vector subscript out of range多线程堆栈,向量下标超出范围
【发布时间】:2019-11-26 00:21:51
【问题描述】:

我正在编写这个多线程类以使用 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;
};

运行这个程序我得到异常“向量下标超出范围”

【问题讨论】:

  • 请显示所有涉及的成员变量的声明。
  • 添加到堆栈时不应该调用vector::push_back 而不是索引吗?或者至少检查std::vector 是否需要增加它的大小(并做一些事情)?
  • @RichardCritten 尝试使用 vector::reserve 我得到了同样的异常
  • 为什么你同时拥有numstring 和laststring?它们有什么区别?
  • 在显示的代码中,您从未以任何方式调整vector 的大小?注意std::vector::reserve 不会改变vector 的大小。

标签: c++ multithreading stack push


【解决方案1】:

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

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

【讨论】:

  • 这里只要调整大小就足够了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-05-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多