2014-10-10 53 views
-1

我正在使用pthread_create从共享库中使用函数。我收到Segmenation故障下面的代码执行后:pthread_create中的分段错误

#include <stdlib.h> 
#include <stdio.h> 
#include <dlfcn.h> 
#include<string.h> 
#include<pthread.h> 
#include<unistd.h> 

void (*GetVersion)(char *version); 

void* draw(void *arg) 
{ 
    void *handle; 
    char *error;  

    handle = dlopen ("libOpenKaillera.so", RTLD_LAZY); 
    if (!handle) { 
     fputs (dlerror(), stderr); 
     exit(1); 
    } 

    GetVersion = dlsym(handle, "GetVersion"); 
    if ((error = dlerror()) != NULL) { 
     fputs(error, stderr); 
     exit(1); 
    } 

    char version[4]; 
    kailleraGetVersion(version); 
    puts(version); 
    dlclose(handle); 
    return NULL; 
} 

int main(void) 
{ 
    pthread_t tid; 

    pthread_create(&tid, NULL, &draw, NULL);   
    sleep(5000); 
    return 0; 
} 

回溯命令说以下内容:

#0 0xb68e7be0 in ??() 
#1 0xb7fa9d56 in __nptl_deallocate_tsd() at pthread_create.c:158 
#2 0xb7fa9f83 in start_thread (arg=0xb7df0b40) at pthread_create.c:325 
#3 0xb7ede4ce in clone() at ../sysdeps/unix/sysv/linux/i386/clone.S:129 

我不明白什么原因可能导致此。你能帮我吗?

+0

甚至没有回溯,不,我们不可能帮助你。你有没有看过调试器呢? – bmargulies 2014-10-10 21:14:18

+0

我在问题 – spandei 2014-10-10 21:46:09

+0

中添加了回溯输出你用什么编译和链接选项? – bmargulies 2014-10-11 00:55:02

回答

1

每次拨打pthread_create后,请记得致电pthread_joinpthread_detach告诉线程如何执行终止。通常,在退出创建线程之前请致电pthread_join(在这种情况下,它是功能main)。

+0

我在主中添加了pthread_join,但问题仍然存在。此外,如果我删除dlclose调用一切正常 – spandei 2014-10-11 10:31:23

+0

@spandei它可能不是一个线程问题,但一个'dlclose'的问题。如果加载的函数在终止时带来了一些问题,可能会产生这样的问题。你可以尝试加载一个最简单的'.so'文件来调查它。 – 2014-10-12 09:56:03