Hi,
I want to remove objects off Queue1, Process, move results to Queue2
In a Multi-Threaded fashion, but my code is Deadlocking:
// Threaded Function
m_threadedFunct = [this]() {
while (m_threadsRunning) {
// Wait
{
unique_lock<mutex> lock(m_mutexMain);
while (m_objsToProcess == 0) m_mutexMainCondition.wait(lock);
}
// Objs to Process
shared_ptr<Object> obj;
{
unique_lock<mutex> lock(m_mutex1);
if (m_queue1.size() > 0) {
obj = m_queue1.back();
m_queue1.pop_back();
}
}
// Process obj
if (obj) {
shared_ptr<Data> data(process(obj));
// Store
{
unique_lock<mutex> lock(m_mutex2);
m_queue2[obj] = data;
}
// Notify Main Thread
{
unique_lock<mutex> lock(m_mutexMain);
--m_objsToProcess;
if (m_objsToProcess == 0) m_mutexMainCondition.notify_all();
}
}
}
};
// Start Threads
for (unsigned int i(0); i < 4; i++) m_threads.emplace_back(thread(m_threadedFunct));
// Main
m_queue1 = fillQueue1();
m_queue2.clear();
{
unique_lock<mutex> calcLock(m_mutexMain);
m_objsToProcess = static_cast<unsigned int>(m_queue1.size());
}
m_mutexMainCondition.notify_all();
{
unique_lock<mutex> calcLock(m_mutexMain);
while (m_objsToProcess > 0) m_mutexMainCondition.wait(calcLock);
}