передать объект по значению в другой поток - PullRequest
1 голос
/ 05 октября 2010

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

По какой-то причине я не могу передать свой элемент в поток пула по значению ...

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

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

}

Причина, по которой я хочу передать по значению, состоит в том, что каждый поток пула потоков имеет свою СОБСТВЕННУЮ копию объекта, так как указатель удаляется из списка первой функцией, это вызовет ошибку, если я передам по ссылке.

Ответы [ 2 ]

2 голосов
/ 05 октября 2010

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

1 голос
/ 05 октября 2010

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

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

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

РЕДАКТИРОВАТЬ: У меня нет прав комментировать, поэтому я отправил как ответ

...