일자무식 님이 쓰신 글 :
: 간단한 큐를 만들어 테스트하던 중입니다.
:
: 이상하게 inserter 쓰레드에서 큐의 put 을 호출할때 세그폴트가 나면서 죽는 경우가
:
: 있습니다.
:
: 도무지 원인을 모르겠습니다. STL 과 thread 간의 문제인가요?....
유닉스에서 POSIX Thread 라이브러리를 쓰시는군요.
이런 내용은 사실상 이 사이트에서는 정확한 답글을 얻으실 수는 없을 겁니다.
저도 유닉스 프로그래밍 쪽은 문외한이라서 pthread에 대해서는 이런 게 있다는 거 정도만 압니다.
아무래도 이곳은 윈도용 볼랜드 컴파일러가 중심이고요,
Linux/Kylix 사이트가 있기는 하지만, 카일릭스, C++Builder, Delphi에서는
컴파일러가 제공하는 크로스 플랫폼 쓰레드 라이브러리인 CLX에서 제공하는
TThread 클래스를 사용합니다.
이런 질문은 KLDP(
http://kldp.org)에 올리시는 것이 더 좋을 겁니다.
일단 pthread와 관련없는 내용으로, 제가 알고 있는 한도에서 코멘트를 해드리겠습니다.
ANSI C++ 표준 라이브러리의 모든 것이 그렇듯이,
STL도 멀티쓰레딩 지원에 대해서는 표준에 일언반구도 없습니다.
오직 라이브러리 벤더가 얼마나 지원해주느냐에 달려있죠.
gcc나 Borland C++Builder 6에서 기본으로 제공하는 SGI STL
(C++빌더는 정확히는 STLport입니다. 약간의 기능이 추가되어 있죠.)의 멀티스레딩 지원은 다음 2가지 밖에는 없습니다.
- 여러 쓰레드에서 읽는 것은 안전하다.
- 여러 쓰레드에서 다른 컨테이너에 쓰는 것은 안전하다.
님의 경우는 "여러 쓰레드에서 같은 컨테이너에 쓰는" 작업이 필요하므로,
Queue의 멤버 함수에서 뮤텍스를 써서 락을 걸고 푸는 코드로 보이는데요,
이렇게 하는 것보다는 Queue의 생성자에서 락을 걸고, 소멸자에서 락을 푸는 방식을 써서 Queue의 존재 기간 전체에 락을 거는 것이 더 확실한 방법으로 보입니다.
그리고, pthread를 쓰는 플랫폼 종속적인 방법보다는,
플랫폼 독립적인 C++ 쓰레드 라이브러리를 쓰시는 방법을 권합니다.
위에서 소개한 CLX의 TThread도 상당히 편리한 라이브러리구요,
(자바 쓰레드보다도 더 쉽습니다.)
Boost 라이브러리에 있는 thread 라이브러리도 상당히 강력합니다.
http://boost.org/libs/thread/doc/index.html
gcc를 쓰신다면 이쪽을 추천합니다.
그리고 한 가지 코멘트를 더 하자면,
STL에는 queue를 비롯해서 stack과 priority_queue가 이미 들어있습니다.