【问题标题】:__lll_lock_wait_private () when using malloc/free__llll_lock_wait_private() 使用 malloc/free 时
【发布时间】:2023-04-07 04:59:01
【问题描述】:

我有一个用户级线程库,我更改了一个基准程序以使用 mythreads 而不是 pthreads,但它总是卡在有 malloc 或 free 函数的代码中。

这是 gdb 的输出:

^C
Program received signal SIGINT, Interrupt.
__lll_lock_wait_private ()
    at ../sysdeps/unix/sysv/linux/x86_64/lowlevellock.S:95
95  ../sysdeps/unix/sysv/linux/x86_64/lowlevellock.S: No such file or directory.
(gdb) where
#0  __lll_lock_wait_private ()
    at ../sysdeps/unix/sysv/linux/x86_64/lowlevellock.S:95
#1  0x00007ffff7569bb3 in _int_free (av=0x7ffff78adc00 <main_arena>, 
    p=0x6f1f40, have_lock=0) at malloc.c:3929
#2  0x00007ffff756d89c in __GI___libc_free (mem=<optimized out>)
    at malloc.c:2950
#3  0x000000000040812d in mbuffer_free (m=m@entry=0x6a7660) at mbuffer.c:209
#4  0x00000000004038a8 in write_chunk_to_file (chunk=0x6a7610, 
    fd=<optimized out>) at encoder.c:279
#5  Reorder (targs=0x7fffffffab60, 
    targs@entry=<error reading variable: value has been optimized out>)
    at encoder.c:1292
#6  0x000000000040b069 in wrapper_function (func=<optimized out>, 
    arg=<optimized out>) at gtthread.c:75
#7  0x00007ffff7532620 in ?? () from /lib/x86_64-linux-gnu/libc.so.6
#8  0x0000000000000000 in ?? ()
(gdb) 

这是一些代码

mbuffer.c
208    if(ref==0) {
209        pausee();
210        free(m->mcb->ptr);
211        resume();
212        m->mcb->ptr=NULL;
213        free(m->mcb);
214        m->mcb=NULL;
215    }

暂停和恢复功能

void pausee(){
    //printf("pauseeing\n");
    sigemptyset(&mask);
    sigaddset(&mask, SIGPROF);   // block SIGPROF...
    if (sigprocmask(SIG_BLOCK, &mask, &orig_mask) < 0) {
        perror ("sigprocmask");
        exit(1);
    }
}
void resume(){
    //printf("restarting\n");
    sigemptyset(&mask);
    sigaddset(&mask, SIGPROF);   // unblock SIGPROF...
    if (sigprocmask(SIG_SETMASK, &orig_mask, NULL) < 0) {
        perror ("sigprocmask");
        exit(1);
    }
}

我不确定这是否与我的问题有关,但为了调度线程,我使用 SIGPROF 信号和处理函数。我尝试在每个 malloc/free 函数之前阻止 SIGPROF,但它没有效果。

我没有任何并发​​线程,一次只运行一个线程。

任何帮助或想法将不胜感激。

【问题讨论】:

标签: c linux malloc signal-handling user-thread


【解决方案1】:

作为你的代码mbuffer.c,没有错。建议你测试一下mbuffer.c,除了你的猜测。

【讨论】:

  • 这个基准测试程序在 pthreads 上运行良好。但是当我使用自己的 ULT 库时,它可能会卡在代码中的任何 malloc/free 函数上,不仅仅是 mbuffer.c,还有其他文件和函数。
猜你喜欢
  • 2014-05-21
  • 2014-05-05
  • 2015-05-28
  • 1970-01-01
  • 2011-12-19
  • 1970-01-01
  • 2012-06-10
  • 1970-01-01
  • 2018-05-23
相关资源
最近更新 更多