Programing/Error Handling2010. 8. 23. 12:26
에러 종류
AssertionError : thread already started

의문점
분명 스레드 목록에서 해당 스레드가 사라져 있는데
Thread 객체를 살펴보니
_Thread__started 는 true로 되어있음
_Thread__stopped 역시 true(이쪽은 스레드가 종료되었으니 당연히 맞는 말이겠고)
그래서 다시 Thread.start(self)를 호출하니 스레드가 이미 시작되었다는 에러가
흠.. 그렇다고 Thread.__init__(self)를 다시 호출하고 start를 호출하면
이번엔 Thread not found 에러가 발생

아, started는 과거형이라서 한번 start를 호출하면 그대로 true로 되어 있는건가
으음.....

@결과
기존에는 스레드를 사용하는 클래스
들이 Thread를 상속받아서 스레드를 동작시키고 있었음.
class Class1 (Thread) :
def __init__ (self) :
Thread.__init__(self)
Thread.start()

def Restart (self) :
Thread.join()
Thread.__init__(self)
Thread.start()

위의 방법에서 아래의 방식으로 변경.
class Class1 :
def __init__ (self) :
self.m_thread = threading.Thread(target=self.run)
self.m_thread.start()
def Restart (self) :
self.m_thread.join()
self.m_thread = threading.Thread(target=self.run)
self.m_thread.start()

아래의 코드로 변경하니 제대로 스레드를 다시 시작시킴

음... 아직 안되는 정확한 이유는 모르겠는데
Thread를 상속받아서 사용하는건 아마 그 상속 때문에 Thread.__init__(self)이 제대로 수행되지 않은듯하다
디버깅하면서 봤을때는 다시 init되는것처럼 보였으나, 스레드 이름만 변경되고
Thread.__started, Thread.__stopped는 false가 아닌 true 그대로 유지되고 있었다

두번째 방법으로 멤버변수를 만들어 덮어 씌우는 형식으로 변경하니 Thread가 제대로 다시 생성되었음
Posted by ratiel
Programing/Error Handling2010. 8. 19. 11:51
에러 종류
Program terminated with signal 11, Segmentation fault.

core 파일 백 트레이스
(gdb) bt
#0  0xb76017b6 in memcpy () from /lib/libc.so.6
#1  0xac432014 in ?? ()
#2  0xb77a1c85 in std::string::_Rep::_M_grab(std::allocator<char> const&, std::allocator<char> const&) () from /usr/lib/libstdc++.so.5
#3  0xb77a1d28 in std::basic_string<char, std::char_traits<char>, std::allocator<char> >::basic_string(std::string const&) ()
   from /usr/lib/libstdc++.so.5
#4  0x0805de21 in Class1::Func1 (this=0x8078400, Factor1=
        {static npos = 4294967295, _M_dataplus = {<std::allocator<char>> = {<No data fields>}, _M_p = 0x809dbdc "115134340"}, static _S_empty_rep_storage = {0, 0, 322, 0}}, Factor2=dword, Factor3=dword Factor4=char*, Factor5=char*,
    Factor6=char*)

의문점
스택을 보다보면 std::string을 함수 인자로 넘겨주면서 복사하다가 에러가 난듯한데
std::string 복사시 memcpy를 사용하는가?
주위에 물어보니 그런일은 없다고 하는데
스택 마지막에는 memcpy가 남아있음
std::string이 문제가 아니라 cher*를 복사하다가 문제가 발생하는 건가?
그쪽은 더 봐야할듯 하다

#1
생각해보니 char* 는 포인터... memcpy를 쓸리가 없지;
결국 std::string 인가
값이 아니라 주소를 넘기는걸로 변경하면 해결할 수 있을것 같은데
역시 조금 더 생각을
Posted by ratiel