Domanda

Sto scrivendo un piccolo progetto di prova e devo passare un oggetto di tipo QueuList in base al valore a un thread del pool di thread.È un threadpool Boost e sto usando Bind per passare gli argomenti al thread.

Per qualche motivo non riesco a passare il mio elemento al thread del threadpool in base al valore...

Qualcuno può aiutarmi in cosa sto facendo di sbagliato?

void ConsumerScheduler()
{
    int count = 0;
    typedef boost::intrusive::list<QueuList> List;
    while (true)
    {
        WaitForSingleObject(hConsumer, 2000); // Wait for hConsomuer to become > 0
        {
            //lock Queue
            QueuList *item = NULL;
            boost::mutex::scoped_lock lock(mtx);
            {//Scope of lock
                if (lst->size() == 0)
                {
                    printf("List is emtpy"); 
                    continue;
                }
                else
                {
                    List::iterator iter(lst->begin());
                    item = &*iter;
                    lst->pop_front();  //Item is removed from list, so pointer is no longer available!!!
                    printf("Popped item off list.  List current size: %d\n",lst->size());
                    count++;
                }
            }
            //Pass to threadpool
            tpp.schedule(boost::bind(taskfunc,*item)); //it will not accept *item or item in this bind function to pass it by value
            total--;
            if (total == 0)
            {
                printf("Total is now zero!\nCount is %d\n", count);
            }
            if (count == 5)
                break;

            ReleaseSemaphore(hProducer,total , NULL);  // Release the hProducer semaphore, possibly waking producer
        }
    }
}

//Thread pool thread function
void taskfunc(QueuList list)
{
    boost::mutex::scoped_lock lock(mtx);
    {
        std::string name= list.GetName();
        printf("Name gotten: %s",name);
    }

}

Il motivo per cui voglio passare per valore è che ogni thread del pool di thread abbia la PROPRIA copia dell'oggetto poiché il puntatore viene rimosso dall'elenco dalla prima funzione, ciò causerà un errore se passo per riferimento.

È stato utile?

Soluzione

È possibile risolvere questo problema utilizzando boost::shared_ptr<QueueList> nella coda e la programmazione di thread. Che meglio esprime la mano fuori dei dati condivisi che si desidera, in assenza di unique_ptr in alcuni STL.

Altri suggerimenti

L'errore si verifica in fase di esecuzione o in fase di compilazione?

Creo il mio codice e non ho errori di compilazione.

Non utilizzo boost, ma, se hai ricevuto un errore in fase di runtime, penso che l'errore sia nel blocco con ambito.Il blocco con ambito non dovrebbe essere all'interno delle parentesi?

MODIFICARE:Non ho i privilegi per commentare, quindi ho pubblicato come risposta

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top