프로그래밍 언어2015. 8. 26. 10:36

리눅스 서버에서 std::thread, std::async를 사용하는 간단한 테스트를 하는데, 컴파일을 마치고 실행을 하니 아래와 같은 에러가 발생했다.


terminate called after throwing an instance of 'std::system_error'
  what():  Operation not permitted
Aborted (core dumped)


역시나 구글링 + 스택오버플로우에서 해답을 찾았다.

g++ (Ubuntu/Linaro 4.6.3-1ubuntu5) 4.6.3를 사용하고 있는데, 컴파일 버전이 낮아서 그런건지 확실하지 않으나, std::thread를 제대로 지원하지 못하고 있는 듯.


암튼 해결 방법은 컴파일 옵션에 -pthread 를 추가 해 주면 된다.

std::thread가 pthread로 동작을 해야 하는데, 내부적으로 처리를 하지 못 하는 건지...


내가 서버 관리자도 아니고, 내 맘대로 컴파일러 버전 올렸다가 뭐래도 안되면 곤란하니,

최신 컴파일러 소스 받아서 빌드하고 테스트 해 봐야겠다.


(Visual Studio 2015는 윈도우 플랫폼에 딱 맞춰서 개발을 할테니, 이런 수고가 필요 없다. VS2015 짱!!!!)

Posted by 세월의돌
프로그래밍 언어2015. 7. 31. 09:52

MEC++ 공부하면서, errata를 발견해서 Scott Meyers 옹의 홈페이지를 방문 해 봤더니, 지난 5월에 report가 되었더라. : )

http://www.aristeia.com/BookErrata/emc++-errata.html



Item 34에 lambda 대신 bind를책에 있는 코드를 그대로 작성했는데 컴파일 에러가 발생했다.


그런데, 옷갖 template의 향연으로인해 에러 메시지는 거의 암호 수준;;


그래서 장인정신으로 STL의 해당 template들을 한 줄 한 줄 따라가다 보니 std::plus functor의 template parameter가 하나의 타입만 받도록 되어 있는데, 실제로 더하려고 하는 object는 std::chrono::steady_clock::time_point와 std::chrono::duration이었기 때문에 발생한 에러 였음.

실제로 std::plus 내부에서 호출하는 operator+는 function template으로 time_point와 duration을 더할 수 있도록 overload 되어 있지만, std::plus는 template이기 때문에 암시적인 형 변환을 할 수 없고, 따라서 operator+까지 도달하지도 못함.



즉, operator+는 연산을 지원하나, binding 시점이 아닌, 호출 시점에 evaluation이 되어야 하기 때문에 사용하는 std::plus가 두 개의 타입을 지원하지 않기 때문에, C++14에서 지원하는 std::plus<void>를 이용(type deducing을 하여 알아서 처리해 줌)하거나, 아니면 직접 가능하도록 구현을 해 주어야 함!


Posted by 세월의돌