Я определяю pthread_mutex_t в общей библиотеке объектов, инициализирую его в процессе и использую в функции библиотеки. Следование структуре кода. Под процессами я подразумеваю отдельные работающие двоичные файлы. Учтите, что запускается несколько потоков, которые запускают function_thread.
Я использую systat и sa для профилирования использования ресурсов и заметил, что память, используемая процессом2, постоянно увеличивается, как будто есть утечка памяти. .
Затем я запускаю процесс2 с помощью Valgrind и сообщаю о результатах. Если я удалю pthread_mutex, ошибки исчезнут. Слово futex в сообщениях об ошибках подсказывает мне, что они вызваны мьютексом. Я делаю что-то не так в коде? Имеет ли смысл объявлять переменную в общей библиотеке, а затем использовать ее в потоках других двоичных файлов?
lib.c:
pthread_mutex_t xwebwd_mutex;
int function_foo() {
...
if (pthread_mutex_trylock(&xwebwd_mutex) == 0) {
pthread_mutex_unlock(&xwebwd_mutex);
}
...
}
process1.c:
extern pthread_mutex_t xwebwd_mutex;
int main() {
...
pthread_mutex_init(&xwebwd_mutex, NULL);
...
pthread_mutex_destroy(&xwebwd_mutex);
return 0;
}
process2.c:
...
function_thread() {
function_foo();
}
...
==4581== Invalid read of size 4
==4581== at 0x4BDDA18: g_cond_signal (in /usr/lib/libglib-2.0.so.0.7200.3)
==4581== Address 0x5d7d90c is 36 bytes inside a block of size 124 free'd
==4581== at 0x4867E54: free (in /usr/libexec/valgrind/vgpreload_memcheck-arm-linux.so)
==4581== Block was alloc'd at
==4581== at 0x486AAA8: calloc (in /usr/libexec/valgrind/vgpreload_memcheck-arm-linux.so)
==4581==
==4581== Invalid write of size 4
==4581== at 0x4BDDA20: g_cond_signal (in /usr/lib/libglib-2.0.so.0.7200.3)
==4581== Address 0x5d7d90c is 36 bytes inside a block of size 124 free'd
==4581== at 0x4867E54: free (in /usr/libexec/valgrind/vgpreload_memcheck-arm-linux.so)
==4581== Block was alloc'd at
==4581== at 0x486AAA8: calloc (in /usr/libexec/valgrind/vgpreload_memcheck-arm-linux.so)
==4581==
==4581== Syscall param futex(futex) points to unaddressable byte(s)
==4581== at 0x50B0EC0: syscall (in /lib/libc.so.6)
==4581== by 0x4BDDA47: g_cond_signal (in /usr/lib/libglib-2.0.so.0.7200.3)
==4581== Address 0x5d7d90c is 36 bytes inside a block of size 124 free'd
==4581== at 0x4867E54: free (in /usr/libexec/valgrind/vgpreload_memcheck-arm-linux.so)
==4581== Block was alloc'd at
==4581== at 0x486AAA8: calloc (in /usr/libexec/valgrind/vgpreload_memcheck-arm-linux.so)
==4581==
==4581==
==4581== HEAP SUMMARY:
==4581== in use at exit: 38,235 bytes in 359 blocks
==4581== total heap usage: 115,927 allocs, 115,568 frees, 23,682,340 bytes allocated
==4581==
==4581== Searching for pointers to 338 not-freed blocks
==4581== Checked 8,776,812 bytes
==4581==
==4581== Thread 1:
==4581== 160 bytes in 1 blocks are possibly lost in loss record 1 of 6
==4581== at 0x486AAA8: calloc (in /usr/libexec/valgrind/vgpreload_memcheck-arm-linux.so)
==4581==
==4581== 584 bytes in 56 blocks are still reachable in loss record 2 of 6
==4581== at 0x4864CB8: malloc (in /usr/libexec/valgrind/vgpreload_memcheck-arm-linux.so)
==4581==
==4581== 1,008 bytes in 21 blocks are still reachable in loss record 3 of 6
==4581== at 0x4C8D7F0: type_node_any_new_W (in /usr/lib/libgobject-2.0.so.0.7200.3)
==4581==
==4581== 9,613 bytes in 21 blocks are still reachable in loss record 4 of 6
==4581== at 0x486ADA8: realloc (in /usr/libexec/valgrind/vgpreload_memcheck-arm-linux.so)
==4581==
==4581== 10,400 bytes in 151 blocks are still reachable in loss record 5 of 6
==4581== at 0x486AAA8: calloc (in /usr/libexec/valgrind/vgpreload_memcheck-arm-linux.so)
==4581==
==4581== 15,378 bytes in 88 blocks are still reachable in loss record 6 of 6
==4581== at 0x4864DE4: malloc (in /usr/libexec/valgrind/vgpreload_memcheck-arm-linux.so)
==4581==
==4581== LEAK SUMMARY:
==4581== definitely lost: 0 bytes in 0 blocks
==4581== indirectly lost: 0 bytes in 0 blocks
==4581== possibly lost: 160 bytes in 1 blocks
==4581== still reachable: 36,983 bytes in 337 blocks
==4581== suppressed: 0 bytes in 0 blocks
==4581==
==4581== ERROR SUMMARY: 6 errors from 4 contexts (suppressed: 0 from 0)
==4581==
==4581== 1 errors in context 1 of 4:
==4581== Thread 2 dbus8528695976:
==4581== Syscall param futex(futex) points to unaddressable byte(s)
==4581== at 0x50B0EC0: syscall (in /lib/libc.so.6)
==4581== by 0x4BDDA47: g_cond_signal (in /usr/lib/libglib-2.0.so.0.7200.3)
==4581== Address 0x5d7d90c is 36 bytes inside a block of size 124 free'd
==4581== at 0x4867E54: free (in /usr/libexec/valgrind/vgpreload_memcheck-arm-linux.so)
==4581== Block was alloc'd at
==4581== at 0x486AAA8: calloc (in /usr/libexec/valgrind/vgpreload_memcheck-arm-linux.so)
==4581==
==4581==
==4581== 2 errors in context 2 of 4:
==4581== Invalid write of size 4
==4581== at 0x4BDDA20: g_cond_signal (in /usr/lib/libglib-2.0.so.0.7200.3)
==4581== Address 0x5d7d90c is 36 bytes inside a block of size 124 free'd
==4581== at 0x4867E54: free (in /usr/libexec/valgrind/vgpreload_memcheck-arm-linux.so)
==4581== Block was alloc'd at
==4581== at 0x486AAA8: calloc (in /usr/libexec/valgrind/vgpreload_memcheck-arm-linux.so)
==4581==
==4581==
==4581== 2 errors in context 3 of 4:
==4581== Invalid read of size 4
==4581== at 0x4BDDA18: g_cond_signal (in /usr/lib/libglib-2.0.so.0.7200.3)
==4581== Address 0x5d7d90c is 36 bytes inside a block of size 124 free'd
==4581== at 0x4867E54: free (in /usr/libexec/valgrind/vgpreload_memcheck-arm-linux.so)
==4581== Block was alloc'd at
==4581== at 0x486AAA8: calloc (in /usr/libexec/valgrind/vgpreload_memcheck-arm-linux.so)
==4581==
==4581== ERROR SUMMARY: 6 errors from 4 contexts (suppressed: 0 from 0)
Подробнее здесь: https://stackoverflow.com/questions/789 ... s-and-leak
Linux c ошибками и утечками мьютексной памяти ⇐ Linux
-
Anonymous
1726654696
Anonymous
Я определяю pthread_mutex_t в общей библиотеке объектов, инициализирую его в процессе и использую в функции библиотеки. Следование структуре кода. Под процессами я подразумеваю отдельные работающие двоичные файлы. Учтите, что запускается несколько потоков, которые запускают function_thread.
Я использую systat и sa для профилирования использования ресурсов и заметил, что память, используемая процессом2, постоянно увеличивается, как будто есть утечка памяти. .
Затем я запускаю процесс2 с помощью Valgrind и сообщаю о результатах. Если я удалю pthread_mutex, ошибки исчезнут. Слово futex в сообщениях об ошибках подсказывает мне, что они вызваны мьютексом. Я делаю что-то не так в коде? Имеет ли смысл объявлять переменную в общей библиотеке, а затем использовать ее в потоках других двоичных файлов?
[b]lib.c:[/b]
pthread_mutex_t xwebwd_mutex;
int function_foo() {
...
if (pthread_mutex_trylock(&xwebwd_mutex) == 0) {
pthread_mutex_unlock(&xwebwd_mutex);
}
...
}
[b]process1.c:[/b]
extern pthread_mutex_t xwebwd_mutex;
int main() {
...
pthread_mutex_init(&xwebwd_mutex, NULL);
...
pthread_mutex_destroy(&xwebwd_mutex);
return 0;
}
[b]process2.c:[/b]
...
function_thread() {
function_foo();
}
...
==4581== Invalid read of size 4
==4581== at 0x4BDDA18: g_cond_signal (in /usr/lib/libglib-2.0.so.0.7200.3)
==4581== Address 0x5d7d90c is 36 bytes inside a block of size 124 free'd
==4581== at 0x4867E54: free (in /usr/libexec/valgrind/vgpreload_memcheck-arm-linux.so)
==4581== Block was alloc'd at
==4581== at 0x486AAA8: calloc (in /usr/libexec/valgrind/vgpreload_memcheck-arm-linux.so)
==4581==
==4581== Invalid write of size 4
==4581== at 0x4BDDA20: g_cond_signal (in /usr/lib/libglib-2.0.so.0.7200.3)
==4581== Address 0x5d7d90c is 36 bytes inside a block of size 124 free'd
==4581== at 0x4867E54: free (in /usr/libexec/valgrind/vgpreload_memcheck-arm-linux.so)
==4581== Block was alloc'd at
==4581== at 0x486AAA8: calloc (in /usr/libexec/valgrind/vgpreload_memcheck-arm-linux.so)
==4581==
==4581== Syscall param futex(futex) points to unaddressable byte(s)
==4581== at 0x50B0EC0: syscall (in /lib/libc.so.6)
==4581== by 0x4BDDA47: g_cond_signal (in /usr/lib/libglib-2.0.so.0.7200.3)
==4581== Address 0x5d7d90c is 36 bytes inside a block of size 124 free'd
==4581== at 0x4867E54: free (in /usr/libexec/valgrind/vgpreload_memcheck-arm-linux.so)
==4581== Block was alloc'd at
==4581== at 0x486AAA8: calloc (in /usr/libexec/valgrind/vgpreload_memcheck-arm-linux.so)
==4581==
==4581==
==4581== HEAP SUMMARY:
==4581== in use at exit: 38,235 bytes in 359 blocks
==4581== total heap usage: 115,927 allocs, 115,568 frees, 23,682,340 bytes allocated
==4581==
==4581== Searching for pointers to 338 not-freed blocks
==4581== Checked 8,776,812 bytes
==4581==
==4581== Thread 1:
==4581== 160 bytes in 1 blocks are possibly lost in loss record 1 of 6
==4581== at 0x486AAA8: calloc (in /usr/libexec/valgrind/vgpreload_memcheck-arm-linux.so)
==4581==
==4581== 584 bytes in 56 blocks are still reachable in loss record 2 of 6
==4581== at 0x4864CB8: malloc (in /usr/libexec/valgrind/vgpreload_memcheck-arm-linux.so)
==4581==
==4581== 1,008 bytes in 21 blocks are still reachable in loss record 3 of 6
==4581== at 0x4C8D7F0: type_node_any_new_W (in /usr/lib/libgobject-2.0.so.0.7200.3)
==4581==
==4581== 9,613 bytes in 21 blocks are still reachable in loss record 4 of 6
==4581== at 0x486ADA8: realloc (in /usr/libexec/valgrind/vgpreload_memcheck-arm-linux.so)
==4581==
==4581== 10,400 bytes in 151 blocks are still reachable in loss record 5 of 6
==4581== at 0x486AAA8: calloc (in /usr/libexec/valgrind/vgpreload_memcheck-arm-linux.so)
==4581==
==4581== 15,378 bytes in 88 blocks are still reachable in loss record 6 of 6
==4581== at 0x4864DE4: malloc (in /usr/libexec/valgrind/vgpreload_memcheck-arm-linux.so)
==4581==
==4581== LEAK SUMMARY:
==4581== definitely lost: 0 bytes in 0 blocks
==4581== indirectly lost: 0 bytes in 0 blocks
==4581== possibly lost: 160 bytes in 1 blocks
==4581== still reachable: 36,983 bytes in 337 blocks
==4581== suppressed: 0 bytes in 0 blocks
==4581==
==4581== ERROR SUMMARY: 6 errors from 4 contexts (suppressed: 0 from 0)
==4581==
==4581== 1 errors in context 1 of 4:
==4581== Thread 2 dbus8528695976:
==4581== Syscall param futex(futex) points to unaddressable byte(s)
==4581== at 0x50B0EC0: syscall (in /lib/libc.so.6)
==4581== by 0x4BDDA47: g_cond_signal (in /usr/lib/libglib-2.0.so.0.7200.3)
==4581== Address 0x5d7d90c is 36 bytes inside a block of size 124 free'd
==4581== at 0x4867E54: free (in /usr/libexec/valgrind/vgpreload_memcheck-arm-linux.so)
==4581== Block was alloc'd at
==4581== at 0x486AAA8: calloc (in /usr/libexec/valgrind/vgpreload_memcheck-arm-linux.so)
==4581==
==4581==
==4581== 2 errors in context 2 of 4:
==4581== Invalid write of size 4
==4581== at 0x4BDDA20: g_cond_signal (in /usr/lib/libglib-2.0.so.0.7200.3)
==4581== Address 0x5d7d90c is 36 bytes inside a block of size 124 free'd
==4581== at 0x4867E54: free (in /usr/libexec/valgrind/vgpreload_memcheck-arm-linux.so)
==4581== Block was alloc'd at
==4581== at 0x486AAA8: calloc (in /usr/libexec/valgrind/vgpreload_memcheck-arm-linux.so)
==4581==
==4581==
==4581== 2 errors in context 3 of 4:
==4581== Invalid read of size 4
==4581== at 0x4BDDA18: g_cond_signal (in /usr/lib/libglib-2.0.so.0.7200.3)
==4581== Address 0x5d7d90c is 36 bytes inside a block of size 124 free'd
==4581== at 0x4867E54: free (in /usr/libexec/valgrind/vgpreload_memcheck-arm-linux.so)
==4581== Block was alloc'd at
==4581== at 0x486AAA8: calloc (in /usr/libexec/valgrind/vgpreload_memcheck-arm-linux.so)
==4581==
==4581== ERROR SUMMARY: 6 errors from 4 contexts (suppressed: 0 from 0)
Подробнее здесь: [url]https://stackoverflow.com/questions/78997683/linux-c-mutex-memory-errors-and-leak[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия