Returning an iterator in a multi-threaded environment is a good idea?

Is it good to return an iterator in a list in an object that is used and used in a multi-threaded environment?

class RequestList
{
public:
    RequestList::RequestList();
    RequestList::~RequestList();

    std::list<boost::shared_ptr<Request> >::iterator GetIterator();
    int ListSize();
    void AddItem(boost::shared_ptr<Request> request);
    void RemoveItem(boost::shared_ptr<Request> request);
    std::list<boost::shared_ptr<Request> > GetRequestsList();
    boost::shared_ptr<Request> GetRequest();

private:
    std::list<boost::shared_ptr<Request> > requests;
    std::list<boost::shared_ptr<Request> >::iterator iter;   //Iterator
    boost::mutex listmtx;
};




std::list<boost::shared_ptr<Request> >::iterator RequestList::GetIterator()
{
    return this->iter;
}

Using:

RequestList* requests;

In some thread (can be used again in other threads)

 std::list<boost::shared_ptr<Request> >::iterator iter = requests->GetIterator();

Or would it be wiser to just create an iterator for this list every time and use it locally inside each thread?

+3
source share
6 answers

No, it is usually not recommended to share an iterator over threads. There are several ways to make sure you have no problem.

-, - , . - . , .

, , . , boost::mutex. , , .

- . , , , , . , , , - .

+3

, , , , . , , , : shared_ptr .

, , - . , , , "" .

, "" , , API , . , . , , :

  • ,
  • .

, , , , .

GetRequestsList . , , .

+2

, , .

, , (, , , , .?)

, , , . , ( ). , (, ?)

+1

, GetIterator, . std::list<>::iterator - , . , .

, . , , , . / .

0

, .

, , , ro- rw- . , , ( ) ? .

, , , , .. , "", list, , , , vector: -)

0

, . , - . , Intel TBB, . , / . ( std::vector ), parallel_for() , () !
. !
, .

0

Source: https://habr.com/ru/post/1768971/


All Articles