首页 文章

提升shared_ptr容器问题

提问于
浏览
0

假设我有一个多线程应用程序使用的指针容器(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而不是原始指针,从容器中删除一个将不会实际释放它,直到它的最后一次使用超出范围 . 即

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完成时,它实际上不会被删除? Note that access to the global vector will be via a critical section.

我认为这是shared_ptrs的工作方式,但我需要确定 .

3 回答

  • 0

    对于boost :: shared_ptr的线程安全性,您应该检查this link . 它不保证安全,但在许多平台上它都有效 . 修改std :: vector不是安全的AFAIK .

  • 3

    在上面的例子中,如果thread1在thread2调用erase之前获取指针,指向的对象是否仍然有效?当thread1完成时,它实际上不会被删除?

    在您的示例中,如果thread1在thread2之前获取指针,则thread2将必须在函数的开头等待(因为锁定) . 所以,是的,指向的对象仍然有效 . 但是,您可能希望在访问其第一个元素之前确保my_vec不为空 .

  • 1

    此外,如果您同步对向量的访问(如在原始原始指针提议中那样),则您的使用是安全的 . 否则,您可能会在另一位受访者提供的链接中违反示例4 .

相关问题