programing tip

std :: shared_ptr 스레드 안전성 설명

itbloger 2020. 8. 24. 07:51
반응형

std :: shared_ptr 스레드 안전성 설명


http://gcc.gnu.org/onlinedocs/libstdc++/manual/shared_ptr.html을 읽고 있으며 일부 스레드 안전 문제가 여전히 명확하지 않습니다.

  1. 표준은 참조 카운팅이 스레드로부터 안전하게 처리되고 플랫폼 독립적임을 보장합니다.
  2. 비슷한 문제-표준은 하나의 스레드 (마지막 참조 보유) 만 공유 객체에서 삭제를 호출하도록 보장합니다.
  3. shared_ptr은 그 안에 저장된 객체에 대한 스레드 안전을 보장하지 않습니까?

편집하다:

의사 코드 :

// Thread I
shared_ptr<A> a (new A (1));

// Thread II
shared_ptr<A> b (a);

// Thread III
shared_ptr<A> c (a);

// Thread IV
shared_ptr<A> d (a);

d.reset (new A (10));

스레드 IV에서 reset ()을 호출하면 첫 번째 스레드에서 생성 된 A 클래스의 이전 인스턴스가 삭제되고 새 인스턴스로 대체됩니까? 또한 IV 스레드에서 reset ()을 호출하면 다른 스레드가 새로 생성 된 객체 만 볼 수 있습니까?


다른 사람들이 지적했듯이 원래의 3 가지 질문에 대해 올바르게 파악했습니다.

하지만 편집의 마지막 부분은

스레드 IV에서 reset ()을 호출하면 첫 번째 스레드에서 생성 된 A 클래스의 이전 인스턴스가 삭제되고 새 인스턴스로 대체됩니까? 또한 IV 스레드에서 reset ()을 호출하면 다른 스레드가 새로 생성 된 객체 만 볼 수 있습니까?

부정확하다. d새로운 가리 킵니다 A(10)하고 a, b그리고 c원래의 지점으로 계속됩니다 A(1). 이것은 다음의 짧은 예에서 명확하게 볼 수 있습니다.

#include <memory>
#include <iostream>
using namespace std;

struct A
{
  int a;
  A(int a) : a(a) {}
};

int main(int argc, char **argv)
{
  shared_ptr<A> a(new A(1));
  shared_ptr<A> b(a), c(a), d(a);

  cout << "a: " << a->a << "\tb: " << b->a
     << "\tc: " << c->a << "\td: " << d->a << endl;

  d.reset(new A(10));

  cout << "a: " << a->a << "\tb: " << b->a
     << "\tc: " << c->a << "\td: " << d->a << endl;

  return 0;                                                                                                          
}

(분명히, 나는 어떤 스레딩도 신경 쓰지 않았습니다. 그것은 shared_ptr::reset()행동에 영향을 미치지 않습니다 .)

이 코드의 출력은 다음과 같습니다.

a : 1 b : 1 c : 1 d : 1

a : 1 b : 1 c : 1 d : 10


  1. 맞습니다. shared_ptrs는 참조 카운트 값의 원자 적 증가 / 감소를 사용합니다.

  2. The standard guarantees only one thread will call the delete operator on a shared object. I am not sure if it specifically specifies the last thread that deletes its copy of the shared pointer will be the one that calls delete (likely in practice this would be the case).

  3. No they do not, the object stored in it can be simultaneously edited by multiple threads.

EDIT: Slight followup, if you want to get an idea of how shared pointers work in general you might want to look at the boost::shared_ptr source: http://www.boost.org/doc/libs/1_37_0/boost/shared_ptr.hpp.


std::shared_ptr is not thread safe.

A shared pointer is a pair of two pointers, one to the object and one to a control block (holding the ref counter, links to weak pointers ...).

There can be multiple std::shared_ptr and whenever they access the control block to change the reference counter it's thread-safe but the std::shared_ptr itself is NOT thread-safe or atomic.

If you assign a new object to a std::shared_ptr while another thread uses it, it might end up with the new object pointer but still using a pointer to the control block of the old object => CRASH.

참고URL : https://stackoverflow.com/questions/9127816/stdshared-ptr-thread-safety-explained

반응형