std :: shared_ptr 스레드 안전성 설명
http://gcc.gnu.org/onlinedocs/libstdc++/manual/shared_ptr.html을 읽고 있으며 일부 스레드 안전 문제가 여전히 명확하지 않습니다.
- 표준은 참조 카운팅이 스레드로부터 안전하게 처리되고 플랫폼 독립적임을 보장합니다.
- 비슷한 문제-표준은 하나의 스레드 (마지막 참조 보유) 만 공유 객체에서 삭제를 호출하도록 보장합니다.
- 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
맞습니다.
shared_ptr
s는 참조 카운트 값의 원자 적 증가 / 감소를 사용합니다.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).
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
'programing tip' 카테고리의 다른 글
데이터베이스 (RDBMS)에 우편 주소를 저장하는 모범 사례? (0) | 2020.08.24 |
---|---|
JSON 결과에서 함수를 정의하는 것이 유효합니까? (0) | 2020.08.24 |
`if __name__ == '__main __'`루비에서 동일 (0) | 2020.08.24 |
R이 회귀에서 지정된 요인 수준을 참조로 사용하도록 강제하는 방법은 무엇입니까? (0) | 2020.08.23 |
Java에는 한때 Pair 클래스가 없었습니까? (0) | 2020.08.23 |