C++11提供智能指针shared_ptr是不是线程安全的

“Boost 文档对于 shared_ptr 的线程安全有一段专门的记述,内容如下:
shared_ptr objects offer the same level of thread safety as built-in types. A shared_ptr instance can be "read" (accessed using only const operations) simultaneously by multiple threads. Different shared_ptr instances can be "written to" (accessed using mutable operations such as operator= or reset) simultaneosly by multiple threads (even when these instances are copies, and share the same reference count underneath.)
Any other simultaneous accesses result in undefined behavior.
翻译为中文如下:
shared_ptr 对象提供与内建类型一样的线程安全级别。一个 shared_ptr 实例可以同时被多个线程“读”(仅使用不变操作进行访问)。 不同的 shared_ptr 实例可以同时被多个线程“写入”(使用类似 operator= 或 reset 这样的可变操作进行访问)(即使这些实 例是拷贝,而且共享下层的引用计数)。
任何其它的同时访问的结果会导致未定义行为。”

这几句话比较繁琐,我总结一下它的意思:

1 同一个shared_ptr被多个线程“读”是安全的。

2 同一个shared_ptr被多个线程“写”是不安全的。

3 共享引用计数的不同的shared_ptr被多个线程”写“ 是安全的。

#include 
std::shared_ptr p1(new int(1000));

void JudgeIsThreadSur(std::shared_ptr& p2)
{
	p2.swap(p1);
	p1.swap(p2);
}
void func()
{
	std::shared_ptr p2(new int(2000));
	for (int i = 0; i < 1000000; ++i)
	{
		JudgeIsThreadSur(p2);
		if (*p2.get() != 2000)
		{
			std::cout << "线程错误\n";
			break;
		}
	}
}

int main()
{
	for (int i = 0; i < 2; ++i)
	{
		std::thread t(func);
		t.detach();
	}
	while (1);
	return 0;
}

通过上述代码可以验证多个线程对shared_ptr写是不安全的。

总结:正如boost文档所宣称的,boost为shared_ptr提供了与内置类型同级别的线程安全性。这包括:

1. 同一个shared_ptr对象可以被多线程同时读取。

2. 不同的shared_ptr对象可以被多线程同时修改。

3. 同一个shared_ptr对象不能被多线程直接修改,但可以通过原子函数完成。

如果把上面的表述中的"shared_ptr"替换为“内置类型”也完全成立。

 

 

你可能感兴趣的:(C/C++)