Question

Je suis en train d'écrire un petit projet d'essai et je dois passer et objet de type QueuList par valeur à un fil de pool de threads. Il est un threadpool Boost et je me sers Bind pour passer les args au fil.

Pour une raison quelconque, je ne peux pas sembler passer mon article au fil ThreadPool en valeur ...

Quelqu'un peut-il aider ce que je fais 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 raison pour laquelle je veux passer par valeur est donc chaque fil de threadpool a sa copie PROPRE de l'objet que le pointeur se retire de la liste par la première fonction, cela provoquera une erreur si je passe par référence.

Était-ce utile?

La solution

Vous pouvez résoudre ce problème en utilisant boost::shared_ptr<QueueList> dans la file d'attente et la planification des threadpool. Qui exprime le mieux la main hors des données partagées que vous voulez, en l'absence de unique_ptr dans certains STL.

Autres conseils

L'erreur se produit lors de l'exécution ou le temps de compilation?

Je crée mon propre code et ne pas erros de compilation.

Je ne pas utiliser boost, mais si vous avez erreur d'exécution, je pense que l'erreur est dans la serrure scope. Le verrou scope ne doit pas être à l'intérieur des crochets?

EDIT: Je ne dispose pas de privilèges aux commentaires, donc je posté comme réponse

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top