我正在编写此多线程类以将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;
};
运行该程序,出现异常“向量下标超出范围”
答案 0 :(得分:0)
由于上面的评论,我知道向量使用通过push_back方法更新的大小和容量。 为了避免这种情况,我在构造函数中使用了reserve和resize方法。
StackAdder::StackAdder()
{
laststring = 0;
numstring = 0;
stack.reserve(100);
stack.resize(100);
}