Pregunta

Estoy escribiendo un proyecto de prueba poco y tengo que pasar y objeto de tipo QueuList por valor de un hilo grupo de subprocesos. Es un threadpool Boost y estoy usando bind para pasar los argumentos de la rosca.

Por alguna razón, parece que no puede pasar a mi artículo al hilo de subprocesos por valor ...

Puede cualquiera ayuda lo que estoy haciendo mal?

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);
    }

}

La razón por la que quiero pasar por el valor es por lo que cada hilo de subprocesos tiene su propia copia del objeto como el puntero se elimina de la lista de la primera función, esto provocará un error si paso por referencia.

¿Fue útil?

Solución

Puede resolver esto mediante el uso boost::shared_ptr<QueueList> en la cola y la programación de subprocesos. Que mejor expresa la mano fuera de los datos compartidos que desea, en ausencia de unique_ptr en algunos STL.

Otros consejos

El error se produce en tiempo de ejecución o compilación tiempo?

Puedo crear mi propio código y no tienen erros de compilación.

Yo no uso impulso, pero, si se ha obtenido un error en tiempo de ejecución, creo que el error está en la cerradura con ámbito. La cerradura con ámbito no debe estar dentro de los corchetes?

EDIT: no tengo privilegios a los comentarios, por lo que he publicado como respuesta

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top