开发者

pass object by value to another thread

开发者 https://www.devze.com 2023-01-18 23:41 出处:网络
I am writing a little trial project and I need to pass and object of type QueuList by value to a thread pool thread.It is a Boost threadpool and I am using Bind to pass the args to the thread.

I am writing a little trial project and I need to pass and object of type QueuList by value to a thread pool thread. It is a Boost threadpool and I am using Bind to pass the args to the thread.

For some reason I cannot seem to pass my item to the threadpool thread by value...

Can anybody help what I'm doing wrong?

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

}

The reason I want to pass by value is so each threadpool thread has it's OWN copy of the object as the pointer gets removed from the list by the first function, this will cause an error if I pass by reference.


You can solve this by using boost::shared_ptr<QueueList> in the queue and the threadpool scheduling. That best expresses the hand off of shared data that you want, in the absence of unique_ptr in some STLs.


The error occurs at runtime or compilation time?

I create my own code and don't have compilation erros.

I do not use boost, but, if you got error on runtime, I think the error is in scoped lock. The scoped lock shouldn't be inside the brackets?

EDIT: I do not have privileges to comment, so I posted as answer

0

精彩评论

暂无评论...
验证码 换一张
取 消