【发布时间】:2012-08-19 13:17:42
【问题描述】:
我有一个boost::shared_ptr<Map>,这个映射正在被多个线程修改,我需要使用显式互斥锁还是线程通过共享指针修改映射的事实,我将获得某种隐式线程安全?
【问题讨论】:
-
没有。
shared_ptr绝对不会为线程安全做任何事情。它所做的只是为动态分配的对象提供引用计数语义。 -
对您的问题的简短回答是“否”。
shared_ptr提供的线程安全仅适用于指针本身。它没有做任何事情来保护对象本身。一旦你从shared_ptr结构中获得了一个指向底层对象的指针,你就不会再有魔法发生了。 -
@DavidSchwartz 我总是通过间接访问对象 shared_ptr 而不是通过原始指针。那会提供线程安全吗?
-
@Jimm:不。shared_ptr 所做的只是给你指向对象的指针。没有什么能阻止一个线程通过该指针修改对象,而另一个线程正在读取它。 shared_ptr 的线程安全只保护共享指针系统,而不保护底层对象。 (例如,如果两个线程同时丢弃指向同一个对象的智能指针,或者如果一个线程同时从智能指针获取常规指针,另一个线程丢弃指向同一个对象的智能指针,它可以确保完整性。等等。)
标签: c++ shared-ptr