У меня есть следующий код, который должен добавить экземпляр shared_ptr в навязчивый связанный список по потоку А. Некоторый другой потребительский поток будет позже использовать его, удалив его из списка. Однако в определенный момент мой shared_ptr кажется уничтоженным, и ссылка на него в связанном списке больше не действительна, что приводит к Assert.
Может кто-нибудь просветить меня, что я делаю не так? Я подозреваю, что это потому, что я создаю свой оригинальный shared_ptr в локальной области видимости, и он просто уничтожается. Хотя в Списке еще должна быть ссылка на него ??? (Это НЕ производственный код)
EDIT:
Определения используемых переменных:
BaseHookQueueList* lst;
typedef boost::intrusive::list<QueueList> BaseHookQueueList;
class QueueList : public boost::intrusive::list_base_hook<>
// Making my BaseHookQueueList take a shared_ptr of pointing to type QueueList conflicts // with the list_base_hook because it does not seem to like shared_ptr...
////////////////////////////////////////////////////////////////////////////////////
if (dwWait == WAIT_OBJECT_0) //Wait is successfull
{
while(count != 100)
{
//Some new request arrived
boost::shared_ptr<QueueList> Qlist (new QueueList()); //Create shared_ptr instance
int temp = 0;
if (count > 5)
{
Qlist->SetName(names[temp]); // Fill up name property of QueueList object with some nonsense...
temp++;
}
else
{
Qlist->SetName(names[count]);
}
workerfunc(lst, Qlist); // Pass to worker func
count++;
}
} // shared_ptr goes out scope and I get ASSERT error from list!!
}
}
void workerfunc(BaseHookQueueList* l, LIST item) // LIST is a typedef shared_ptr<QueueList> LIST
{
{
boost::mutex::scoped_lock workerfunclock(listlock);
l->push_front(*item); //Add to list
}
//Scope of lock
{
boost::mutex::scoped_lock workerfuncconsoleLock(consolelock);
printf("Adding item to list...\n");
}
ReleaseSemaphore(hConsumer, 1, NULL); // Set conumser Semaphore to Signalled with number of items currently on the queue
}