Lets tallk about the next code sample:
#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;
}
When I run this program I get "abort" but I shouldnt. The only reason I see here to get abort is when I leaves locked lock without opened it - but there is no any reason for a lock to stay locked because after every loop I passes I open the lock.
What do you see the reason is?