std::shared_ptr 는 쓰레드 세이프하지 않음

std::shared_ptr 는 쓰레드 세이프하지 않습니다. 관련 예제와 볼만한 링크를 남깁니다.

예제 1. 소멸자 호출 후 자원 접근

#include <iostream>
#include <memory>
#include <thread>

struct Foo
{
	int val;

	Foo()
	{
		val = 1;
	}

	~Foo()
	{
		val = -1;
	}
};

int main()
{
	while (true)
	{
		std::shared_ptr< Foo > ptr = std::make_shared< Foo >();
		std::weak_ptr< Foo > wptr = ptr;

		std::thread t1(
			[ &ptr ]()
			{
				ptr.reset();
			} );

		std::thread t2(
			[ wptr ]()
			{
				std::shared_ptr< Foo > ptr = wptr.lock();

				if ( ptr )
				{
					// This should not print -1.
					std::cout << ptr->val << std::endl;
				}
			} );

		t1.detach();
		t2.detach();
	}
}

예제 2. Undefined behavior

#include <thread>

std::shared_ptr<int> g_ptr = nullptr;

int main() {
	std::thread t1([]() {
		int i = 0;
		while (true) {
			g_ptr = std::make_shared<int>(i);

			++i;
		}
	});

	std::thread t2([]() {
		while(true) {
			std::shared_ptr<int> ptr = g_ptr;
		}
	});

	t1.join();
	t2.join();

	return 0;
}

볼만한 링크

c++ why std::shared_ptr need atomic_store, atomic_load or why we need atomic shared_ptr