При обращении к очереди receive() вызывается из одного потока, process() из другого.
Я в примере их убрал, было примерно так.
#include <mutex>
std::mutex m;
bool isTestInQueue()
{
std::lock_guard<std::mutex> lock(m);
const bool rc = q.empty();
return !rc;
}
const std::shared_ptr<class Test>& getLast()
{
std::lock_guard<std::mutex> lock(m);
const std::shared_ptr<class Test>& rc = q.front();
std::cout << "getLast1: use_count=" << rc.use_count() << std::endl;
q.pop();
std::cout << "getLast2: use_count=" << rc.use_count() << std::endl;
return rc;
}
void receive(const std::shared_ptr<class Test>& t)
{
std::cout << "receive: use_count=" << t.use_count() << std::endl;
std::lock_guard<std::mutex> lock(m);
q.push(t);
}