2010-10-05 2 views
1

Я пишу небольшой пробный проект, и мне нужно передать объект типа QueuList по значению потоку пула потоков. Это Boost threadpool, и я использую Bind для передачи args в поток.передать объект по значению в другой поток

По некоторым причинам я не могу показаться, чтобы передать свой товар в Threadpool нить по значению ...

Может кто-нибудь помочь, что я делаю неправильно?

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

} 

Поэтому я хочу передать по значению, так что каждый ThreadPool нить имеет собственную копию объекта, как указатель получает удаляется из списка с помощью первой функции, это вызовет ошибку, если я перехожу по ссылке ,

+1

пожалуйста, покажите, как 'определяется tpp' и вывод компилятора –

ответ

2

Вы можете решить эту проблему, используя boost::shared_ptr<QueueList> в очереди и расписание потока. Это наилучшим образом отражает передачу данных, которые вы хотите, в отсутствие unique_ptr в некоторых STL.

+0

На самом деле это не так:' shared_ptr' о совместной собственности, только стандартный смарт-указатель, выражающий однократную передачу вручную, является 'unique_ptr' и пока недоступен во всех STL. 'shared_ptr' - наименее наихудшая замена в среднем времени. –

+0

@Matthieu - Я подумал, что лучше всего предложить решение, которое широко поддерживается, чтобы избежать путаницы. –

+0

Я согласен с тем, что решение хорошее, но я бы изменил комментарий «выражает комментарий одного экземпляра». общие и синглы на самом деле не смешиваются, семантически. –

1

Ошибка возникает во время выполнения или времени компиляции?

Я создаю свой собственный код и не имею компиляции erros.

Я не использую boost, но, если у вас возникла ошибка во время выполнения, я думаю, что ошибка связана с блокировкой. Скользящий замок не должен находиться внутри скобок?

EDIT: Я не имею права комментировать, поэтому я отправил в ответ

+0

Ошибка времени компиляции, а не ее блокировка. –

+0

Какая ошибка? Вы внедрили конструктор копирования QueuList? –

+0

Я понимаю, что 'boost :: mutex :: scoped_lock lock (mtx);' должен быть помещен внутри * области, а не над ней, как сказал @Bruno Caponi. – j4x

Смежные вопросы