【发布时间】:2017-02-07 16:24:18
【问题描述】:
让我们谈谈下一个代码示例:
#include <iostream> // std::cout
#include <thread> // std::thread
#include <mutex> // std::mutex, std::unique_lock
#include <condition_variable> // std::condition_variable
#include <deque>
std::mutex mtx;
std::condition_variable cv;
bool ready = false;
std::deque<int> queue;
void Inserter()
{
int count = 10;
while (count >= 0)
{
std::unique_lock<std::mutex> lock(mtx);
queue.push_back(count);
--count;
lock.unlock();
}
}
void Consumer()
{
int count = 10, got;
while (count >= 0)
{
std::unique_lock<std::mutex> lock(mtx);
if (!queue.empty())
{
got = queue.back();
queue.pop_back();
std::cout << "We got: " << got << std::endl;
--count;
lock.unlock();
}
else
{
lock.unlock();
}
}
}
int main()
{
std::thread t1(Inserter);
std::thread t2(Consumer);
std::cin.get();
return 0;
}
当我运行这个程序时,我得到“中止”,但我不应该这样做。 我在这里看到中止的唯一原因是当我离开锁定的锁而没有打开它时 - 但是没有任何理由让锁保持锁定,因为在每个循环之后我都会打开锁。
你看到的原因是什么?
【问题讨论】:
-
您是否尝试使用调试器单步执行您的代码?
-
获得“中止”并不是具体的描述。您是否在标准库中触发断言,是否导致访问冲突,...?
-
如果这是 Visual Studio,请在对话框出现时按 Debug,然后将调用堆栈向上移动到您的代码。
标签: c++ multithreading