전체 글
개발 공부 공간CMake 기본 포맷과 예제
# 요구 CMake 최소 버전CMAKE_MINIMUM_REQUIRED ( VERSION ) # 프로젝트 이름 및 버전PROJECT ( "" )SET ( PROJECT_VERSION_MAJOR )SET ( PROJECT_VERSION_MINOR ) # 빌드 형상(Configuration) 및 주절주절 Makefile 생성 여부SET ( CMAKE_BUILD_TYPE )SET ( CMAKE_VERBOSE_MAKEFILE ) # 빌드 대상 바이너리 파일명 및 소스파일 목록SET ( OUTPUT_ELF "${CMAKE_PROJECT_NAME}-${PROJECT_VERSION_MAJOR}.${PROJECT_VERSION_MINOR}.out" )SET ( SRC_FILES ... ) # 공통 컴파일러SET ( CM..
pthread에서 메모리 침범과 pthread_cancel
메인 스레드가 join을 통해 다른 스레드들을 기다릴 수 없는 상황이라면(join없이 detach를 통해 스레드가 독립적으로 일을 할 때) 프로세스를 종료하는 시점에 A 스레드가 전역변수를(또는 다른 스레드의 리소스) 접근 할 때 문제가 발생할 수 있다. (이미 해제 된 메모리를 접근 하려 하기 때문에 SIGSEGV나 SIGABRT가 발생 할 수 있음) 프로세스가 SIGTERM 시그널을 받았거나 앱라이프 사이클에서 terminate시점이라면 pthread_cancel을 통해 스레드들을 먼저 종료해주어야 한다.(+스레드에서 쓰던 메모리도 회수) [pthread_cancel 예제 코드] 12345678910111213141516171819202122232425262728293031323334353637383..
정적 라이브러리(static library)와 공유 라이브러리(shared library)
동적라이브러리 충돌문제가 생겨서 라이브러리구조와 만드는 방법에 대해서 공부를 해보게 되었다. 우선 리눅스에서 라이브러리는 다른 프로그램에서 사용 할 수 있도록 미리 만들어진 하나이상의 서브 루틴이나 함수들이 모여있는 파일이다.라이브러리 종류는 정적 라이브러리(static library=>.a파일)와 공유 라이브러리(shared library=>.so파일)이 있다. 둘다 장단점이 명확하지만 주로 라이브러리는 배포하기 위한 목적성을 갖기 때문에 대부분 .so형태로 만들어서 사용 된다. 간단한 예제를 통해 계산기 기능을 가지고 있는 정적 라이브러리와 동적 라이브러리를 만들어 보자. [sum.h]#ifndef __SUM__H#define __SUM__Hint sum(int a, int b); #endif [su..
Dead lock과 pthread에서 mutex lock하는 방법
공유자원(파일)에 대해서 pthread의 lock에 대해 알아보던 중 pthread_mutex_lock 외에도 pthread_mutex_trylock, pthread_mutex_timedlock이 있다는걸 알게되었다. 추가적으로 dead lock 가능성을 피하기 위해 잠시 dead lock에 대해 복습해 보면 dead lock 두가지 상황에서 발생할 수 있다. 1) A thread에서 mutex lock변수 a를 이용해서 lock을 진행한 상태에서 다시 a를 lock 하려고 할때 발생.(보통 재귀적으로 구현 된 함수에서 lock을 거는 경우 발생함) 2) A thread에서 mutex lock변수 a를 lock하고 B thread에서 mutex lock변수 b를 lock을 한 상태에서 A thread에서..
[C++] delete시 주의점
unmanaged 언어인 c++에서 메모리 관리는 전적으로 개발자가 해야한다.malloc이나 new로 메모리가 할당된 객체를 delete,free할 때 delete 후 NULL을 할당해 주지 않고 실수로 다시 한번 객체를 delete,free하게 된다면 segmentation fault가 발생한다. 결론적으로 template 함수로 delete와 null할당을 해주면 편할 것 같다. #include#includeusing namespace std;class Test{ };void endProgram(Test *t){ if(t){ printf("endProgram object t delete\n"); delete t; }}void readyForEnd(Test * t){ if(t){ printf("read..
oom_adj 또는 oom_score_adj
Tizen 개발을 하다 우연히 알게된 개념이다. 검색해보니 안드로이드에서 원래 사용되던 개념. 우선 OOM은 Out Of Memory이다.쉽게 말해 어떤 프로세스가 시스템내에서 허용된 메모리를 넘어가게되면 OOM이 발생한다. 그래서 시스템에서는 OOM Killer또는 Low Memory Killer같은 OOM관리 프로세스를 통해서 OOM을 관리한다. 그때 어떤 프로세스를 먼저 줄일지에 대한 지표가 되는게 oom_adj(=oom_score_adj)이다.즉 , 메모리 부족시 oom_adj가 큰 값부터 차례대로 프로세스를 죽여나가고 만약 oom_adj값이 같다면 RSS가 큰 프로세스부터 죽인다.oom killer에 의해 종료되고 싶지 않다면 oom killer의 proc에 설정을 변경해 줘야 한다. Tizen..
pthread 사용시 주의할점과 tread detach, join에 관해
pthread를 사용하는 멀티스레드 프로그램에서 여러가지 테스트 중 메모리 누수가 발생했다. 분석 결과 매번 어떤 기능을 할 때 pthread_create를 통해 생성 된 새로운 thread가 작업을 처리하고 thread가 끝나는 구조인데pthread_create 후 메모리를 회수 하지 않아서 문제가 되었다. 예제처럼 pthread를 사용하면 memory leak발생가능 12345678910111213141516171819202122232425262728293031323334353637383940#include#include#include #include void *thread_test(void * data){ char * str = (char*)malloc(sizeof(1024)); printf("Th..