[완료] g_async_queue 에 관한 질문입니다.

ohpowel의 이미지

제가 간단하게 테스트를 해보았을 때는

커널에서 제공하는 메시지 큐 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++ 모두의 경우에 대해서 궁금하네요. (그리고 플랫폼에 따른 차이가 있는지 없는지도)
질문이 너무 길어 졌네요 -_-;; 죄송합니다.

haze11의 이미지

free의 정의:
void free(void *ptr);

malloc/free 는 타입을 따지지 않잖아요? =.=
그냥 주소 놀음인...

ohpowel의 이미지

아 답변 감사드립니다. ^^

malloc 시에 포인터 주소값만 free 할 때 동일하면 타입에 상관없이
정상적으로 된다는 말씀이시군요~

그럼 궁금한 게
malloc시에 library가 동적할당 된 메모리의 길이를 따로 저장하고 나중에 free 할 때 그 길이를 이용하는 건가요?
아님 그냥 길이에 필요없이 free 하면 쭉 동적 메모리를 알아서 돌려줘 버릴 수 있는 건가요?

No signature

pastime의 이미지

네.. malloc 시에 별도로 저장해 둡니다.

ohpowel의 이미지

haze11님과 pastime님 답변 감사드립니다 ^^

No signature

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.