2010-10-05 22 views
1

Je suis en train d'écrire un petit projet d'essai et j'ai besoin de passer et de l'objet de type QueuList par valeur à un thread de thread. C'est un pool de threads Boost et j'utilise Bind pour passer les arguments au thread.passer l'objet par la valeur à un autre thread

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 la 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 entraînera une erreur si je passe par référence .

+1

s'il vous plaît montrer comment 'tpp' est défini et la sortie du compilateur –

Répondre

2

Vous pouvez résoudre ce problème en utilisant boost::shared_ptr<QueueList> dans la file d'attente et la planification du pool de threads. C'est ce qui exprime le mieux les données partagées que vous voulez, en l'absence de unique_ptr dans certaines LIST.

+0

En fait, il ne fait pas:' shared_ptr' est sur la propriété partagée, la Seul le pointeur intelligent standard exprimant le transfert d'instance unique est 'unique_ptr' et n'est pas encore disponible dans toutes les STL. 'shared_ptr' est le remplacement le moins pire dans le temps. –

+0

@Matthieu - J'ai pensé qu'il était préférable d'offrir une solution largement supportée pour éviter toute confusion –

+0

Je suis d'accord pour dire que la solution est bonne, mais je modifierais le commentaire "exprime le single-instance hand off". partagé et unique ne mélange pas vraiment, sémantique-sage. –

1

L'erreur se produit au moment de l'exécution ou de la compilation?

Je crée mon propre code et je n'ai pas d'erreur de compilation.

Je n'utilise pas boost, mais, si vous avez une erreur sur l'exécution, je pense que l'erreur est en mode verrouillé. Le verrou de portée ne doit pas être à l'intérieur des supports?

EDIT: Je ne dispose pas de privilèges à tout commentaire, donc j'ai posté en réponse

+0

Erreur de compilation et pas de verrou de portée. –

+0

Quelle erreur? Vous avez implémenté le constructeur de copie de QueuList? –

+0

Je comprends que le verrou 'boost :: mutex :: scoped_lock (mtx);' devrait être mis * dans la portée, et non au-dessus, comme l'a dit @Bruno Caponi. – j4x