假设我有一个多线程应用程序使用的指针容器(std::vector)。在向容器添加新指针时,代码使用临界区 (boost::mutex) 进行保护。一切都很好。代码应该能够将这些指针之一返回给线程以进行处理,但另一个单独的线程可以选择删除这些指针之一,该指针可能仍在使用中。例如:
thread1()
{
foo* p = get_pointer();
...
p->do_something();
}
thread2()
{
foo* p = get_pointer();
...
delete p;
}
所以thread2可以在thread1使用它时删除指针。讨厌。
因此,我想使用 Boost 共享 ptrs 的容器。IIRC 这些指针将被引用计数,因此只要我返回共享 ptrs 而不是原始指针,从容器中删除一个不会真正释放它,直到最后一次使用它超出范围。IE
std::vector<boost::shared_ptr<foo> > my_vec;
thread1()
{
boost::shared_ptr<foo> sp = get_ptr[0];
...
sp->do_something();
}
thread2()
{
boost::shared_ptr<foo> sp = get_ptr[0];
...
my_vec.erase(my_vec.begin());
}
boost::shared_ptr<foo> get_ptr(int index)
{
lock_my_vec();
return my_vec[index];
}
在上面的例子中,如果thread1在thread2调用erase之前获得了指针,那么指向的对象是否仍然有效?当thread1完成时它实际上不会被删除?请注意,对全局向量的访问将通过临界区进行。
我认为这就是 shared_ptrs 的工作方式,但我需要确定。