[완료] g_async_queue 에 관한 질문입니다.
제가 간단하게 테스트를 해보았을 때는
커널에서 제공하는 메시지 큐 IPC의 경우에 메시지를 큐에 복사해서 집어 넣구
glib 에서 제공하는 async queue는 같은 프로세스 내에서 동작하는 거라서 그런지 그냥 포인터 값만 전달을 하는 것 같습니다.
위에 쓴 말이 맞는 건가요?
그런데 문제가 위에 두 큐를 섞어 사용하는 코드를 보는 중인데요.
IPC메시지큐 g_async_queue
전송 프로세스 ---------------> 메인 쓰레도(수신프로세스) -----------> 내부 쓰레드 (수신프로세스)
(전송하는 프로세스로 부터 IPC 메세지를 메인 쓰레드가 받아서 g_async_queue에 저장하고 내부 쓰레드에서 그 메시지를 사용하는 코드)
전송하는 프로세스에서 IPC 메시지를 보낼 때 사용하는 구조체가 아래와 같이, data 부분을 배열로 만들지 않고 malloc으로 할당한 후 포인터 연산을 통해서 구조체에 덧붙여서 전송을 합니다.
typedef struct {
long data_type;
int data_num;
} t_data;
<-- 이 구조체 뒤에 char 를 덧붙임
그리고 수신 프로세스의 메인 쓰레드는 이 메시지를 char 포인터 buffer(사이즈 4096)를 malloc 한 다음에
t_data* data = (t_data*) buffer
위와 같이 타입 캐스팅을 한 후에 내부 쓰레드를 위해 g_async_queue에 집어 넣습니다.
그리고 내부 쓰레드는 g_async_queue에서 메시지를 꺼내서 free 를 하게 됩니다.
근데 제 생각에는 과연 메모리 free가 제대로 되는 건지 궁금합니다.
원래 char* 타입인데 t_data 로 타입 캐스팅 해도 free 할 때 실제 4096 사이즈 만큼 free를 제대로 하게 될 까요?
C나 C++ 모두의 경우에 대해서 궁금하네요. (그리고 플랫폼에 따른 차이가 있는지 없는지도)
질문이 너무 길어 졌네요 -_-;; 죄송합니다.
free의 정의: void
free의 정의:
void free(void *ptr);
malloc/free 는 타입을 따지지 않잖아요? =.=
그냥 주소 놀음인...
답변 감사드립니다~
아 답변 감사드립니다. ^^
malloc 시에 포인터 주소값만 free 할 때 동일하면 타입에 상관없이
정상적으로 된다는 말씀이시군요~
그럼 궁금한 게
malloc시에 library가 동적할당 된 메모리의 길이를 따로 저장하고 나중에 free 할 때 그 길이를 이용하는 건가요?
아님 그냥 길이에 필요없이 free 하면 쭉 동적 메모리를 알아서 돌려줘 버릴 수 있는 건가요?
No signature
네.. malloc 시에
네.. malloc 시에 별도로 저장해 둡니다.
미천한 질문에 답변해 주셔서 감사드립니다~~!!
haze11님과 pastime님 답변 감사드립니다 ^^
No signature
댓글 달기