최근에 저는 하나의 레거시 프로젝트에서 작업하고 segfaults (이중 삭제)를 수정하려고했습니다. 많은 사람들이 boost::shared_ptr
소멸자 또는 (shared_ptr을 포함하는 객체)에서 발생합니다. 이 코드에는 복사, 재설정(), 할당 등을 포함한 shared_ptr-s의 방대한 사용이 포함되어 있습니다. boost docs에 따르면 유효한 사용법이 없습니다. 많은 스레드에서 동일한 shared_ptr을 파괴/복사/재설정하는 것이 안전하지 않습니다.boost :: shared_ptr 드롭 인 대체
매번 잠금 기능을 사용할 수 없으므로 boost :: shared_ptr 대신 drop-in replacement를 검색합니다. 질문 : 모든 boost::shared_ptr
을 std::shared_ptr
또는 std::tr1::shared_ptr
으로 바꿀 경우이 문제가 해결됩니까? Tr1이 더 안전한 버전이라고 생각되지만 그 점은 분명하지 않습니다. 두 번째 질문 - tr1보다 C++ 0x 버전이 더 나은가요? ++ 11 표준 : : shared_ptr의 그 문제를 해결하지만, gcc4.4 버전에 대해 확실하지 메신저해야 c를 ...,
gcc docs에 accoring에
UPD를 (우리가 GCC 4.4.6을하고 업그레이드 할 수 있습니다) : 그냥
#include <iostream>
#include <boost/thread.hpp>
#include <boost/shared_ptr.hpp>
typedef boost::shared_ptr<int> ptrtype;
ptrtype p(new int);
void test() {
for(long i=0; i<1000000; ++i) {
ptrtype p1 = p;
p = ptrtype();
p.reset(new int);
}
}
int main() {
boost::thread_group tg;
for(int i=0; i<100; ++i) tg.add_thread(new boost::thread(test));
tg.join_all();
std::cout << "Normal exit\n";
return 0;
}
boost :: shared_ptr은 매우 견고합니다. 다른 구현으로 바꾸면 아무 것도 해결하지 못할 것이라고 생각합니다. 이중 삭제가 표시되는 경우 버그를 찾아 수정하기 전까지 계속해서이를 볼 수 있습니다. – Bukes
"매번 잠금이 불가능한 것 같습니다"는 것은 스레딩 문제가 있음을 나타냅니다. 스마트 포인터 구현을 변경하면 아무 것도 사지 않을 것입니다. boost :: shared_ptr은 버그가 없습니다. –
스레드 안전 공유 포인터를 찾고 계십니까? –