【发布时间】: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