繁体   English   中英

pthread_mutex_trylock段故障

pthread_mutex_trylock segment fault

提示:本站收集StackOverFlow近2千万问答,支持中英文搜索,鼠标放在语句上弹窗显示对应的参考中文或英文, 本站还提供   中文繁体   英文版本   中英对照 版本,有任何建议请联系yoyou2525@163.com。

我花了一周的时间来修复程序,一开始我得到了SIGBUS,但是经过多次尝试,程序仍然出现SIGSEGV段故障,下面我发布了段故障日志和源代码。 如果专家帮助我修复此段错误,我将不胜感激。 任何建议都受到高度赞赏。 提前致谢

LL_NODE *ll_prepend(LLIST *l, void *obj)
{
    if (l && obj) {
//line bellow is module-datastruct-llist.c:167 
//mentioned in segment-fault log as frame 3

      if (!ll_lock(l)) return NULL;
        LL_NODE *new;
        if(!cs_malloc(&new,sizeof(LL_NODE), -1)) return NULL;
        new->obj = obj;
        new->nxt = l->initial;
        l->initial = new;
        if (!l->last)
            l->last = l->initial;
        l->count++;
        ll_unlock(l);
        return new;
    }
    return NULL;
}






int32_t ll_lock(LLIST *l)
{
    int32_t res = 1;
   res=cs_trylock(&l->lock);

//line bellow is module-datastruct-llist.c:51  
//mentioned in segment-fault log as frame 2

  while (l && !l->flag && res) {
        cs_debug_mask(D_TRACE, "trylock ll_lock wait");
        cs_sleepms(fast_rnd()%5 + 1);
    }
    return !res;
}







int32_t cs_trylock(pthread_mutex_t *mutex){

    if(!mutex) return -1;
        int32_t result, oldtype;
        /* Make sure that we won't get interrupted while getting the lock */
        pthread_setcanceltype(PTHREAD_CANCEL_DEFERRED, &oldtype);

//line bellow is oscam-simples.c:1233  
//mentioned in segment-fault log as frame 1

        if((result=pthread_mutex_trylock(mutex)) == 0){

            struct s_client *cl = cs_preparelock(cur_client(), mutex);
            if(cl)
                cl->mutexstore_used++;
        }
        pthread_setcanceltype(oldtype, NULL);
        pthread_testcancel();
        return result;
    }

// in this function &l->lock is initialized   
LLIST *ll_create()
{
    LLIST *l = cs_malloc(&l, sizeof(LLIST), 0);
    pthread_mutex_init(&l->lock, NULL);
    return l;
}



Segment fault log :
Program received signal SIGSEGV, Segmentation fault.
[Switching to LWP 1905]
0x2979b7ba in pthread_mutex_trylock () from /lib/libpthread.so.0
(gdb) bt
#0  0x2979b7ba in pthread_mutex_trylock () from /lib/libpthread.so.0
#1  0x00410d98 in cs_trylock (mutex=0x247373a4) at oscam-simples.c:1233
#2  0x0043d4aa in ll_lock (l=0x24737398) at module-datastruct-llist.c:51
#3  0x0043d956 in ll_prepend (l=0x24737398, obj=0x4a2410)
    at module-datastruct-llist.c:167
#4  0x0040a66e in get_cw (client=0x4daa80, er=0x5063a0) at oscam.c:2645
#5  0x00439754 in dvbapi_process_input (demux_id=0, filter_num=0,
    buffer=0x2a98bb60 "\201q=", len=320) at module-dvbapi.c:1634
#6  0x0043c866 in stapi_read_thread (sparam=0x4d1558) at module-dvbapi.c:2441
#7  0x29799486 in ?? () from /lib/libpthread.so.0
Backtrace stopped: frame did not save the PC
(gdb) info args
No symbol table info available.
1 个回复

问题来自l->lock ,它从未初始化,因此包含非NULL的不可用垃圾。

尝试添加l->lock = NULL; 或通过创建互斥锁将其正确初始化。

1 Linux中的pthread_mutex_trylock()

我正在学习在Linux编程中使用互斥锁。 我遇到了trylock函数,该函数首先检查互斥锁是否可用,否则将其锁定,然后返回。 现在我的问题是: 调用trylock时,在不执行关键部分的情况下到达函数末尾后是否返回? 为什么在下面的代码中没有显示errno ? 这 ...

2 pthread_mutex_trylock和pthread_mutex_unlock导致分段错误

一旦线程取消,就需要解锁互斥锁,以避免死锁。 因此,我设计了以下方法: 我在这里使用pthread_mutex_trylock()的原因是,如果互斥锁已在其他位置解锁,则可以避免第二个pthread_mutex_unlock()。 但是,此处的pthread_mutex_tryl ...

4 如何使用pthread_mutex_trylock?

使用trylock: 然后是main(): 这里输出首先打印一些第一个线程然后打印其余部分,然后再打印第一个线程。 锁不起作用。 如果我用pthread_mutex_lock替换它,每个东西都会按顺序显示! 这里有什么荒谬的错误? ...

6 对`pthread_mutex_trylock'的未定义引用

我有以下测试程序。 如果我在不添加pthread库的情况下进行编译,则会得到pthread_mutex_trylock的未解决错误,但仅针对pthread_mutex_trylock函数。 如果我将pthread_mutex_trylock替换为pthread_mutex_tryl ...

9 轮询`pthread_mutex_trylock`是否有意义?

考虑一个运行两个线程的多核系统:线程A和线程B,它们共享一些数据。 线程A需要尽快完成其工作,因此我们希望它尽可能多地处于唤醒状态。 放弃使用自旋锁(无论是pthread还是在原子基元之上实现),因为我们希望线程B在等待获得锁时休眠。 以下列方式将繁忙等待(自旋锁定)和“睡眠等待” ...

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2021 STACKOOM.COM