2013-03-26 83 views
-1

我在试图处理posix线程的奇怪问题上阻塞。 我的代码开始:mutex_init()导致奇怪的段错误

#include <pthread.h> 
#include <semaphore.h> 


typedef struct { 
    pthread_mutex_t *mutex; 
} buffer_t; 


buffer_t *buffer_alloc(unsigned int maxSize) { 

    buffer_t *buffer = (buffer_t *) malloc(sizeof(buffer_t)); 
    if(buffer == NULL) 
     return NULL; 

    pthread_mutex_init(buffer->mutex, NULL); // This line causes a crash 

    pthread_mutex_t *mutex; 
    pthread_mutex_init(mutex, NULL); // This one doesn't 

}

我第一pthread_mutex_init()得到一个分段错误。 这里的gdb的runlog和回溯:

[Thread debugging using libthread_db enabled] 
Using host libthread_db library "/lib/x86_64-linux-gnu/libthread_db.so.1". 


Program received signal SIGSEGV, Segmentation fault. 
__pthread_mutex_init (mutex=0x0, mutexattr=0x0) at pthread_mutex_init.c:83 
83 pthread_mutex_init.c: No such file or directory. 

(gdb) backtrace 
#0 __pthread_mutex_init (mutex=0x0, mutexattr=0x0) at pthread_mutex_init.c:83 
#1 0x00000000004015a8 in buffer_alloc (maxSize=10) at buffers.c:26 

感谢您的帮助!互斥初始化

typedef struct { 
    pthread_mutex_t mutex; 
} buffer_t; 

,然后到:

回答

0

你传递给pthread_mutex_init()指针未初始化,它并不指向分配的内存,所以你的程序调用未定义的行为。你可以做的是修改你的结构或buffer_alloc()函数为互斥体显式分配内存。 I. E,溶液#1(我喜欢这个):

typedef struct { 
    pthread_mutex_t mutex; 
} buffer_t; 

buffer_t *buffer_alloc(unsigned int maxSize) 
{ 
    buffer_t *buffer = malloc(sizeof(*buffer)); 
    if (buffer == NULL) 
     return NULL; 

    pthread_mutex_init(&buffer->mutex, NULL); 

    // etc. 
    return buffer; 
} 

溶液#1中,动态分配:

typedef struct { 
    pthread_mutex_t *mutex; 
} buffer_t; 

buffer_t *buffer_alloc(unsigned int maxSize) 
{ 
    buffer_t *buffer = malloc(sizeof(*buffer)); 
    if (buffer == NULL) 
     return NULL; 

    buffer->mutex = malloc(sizeof(*(buffer->mutex))); 
    if (buffer->mutex == NULL) { 
     free(buffer); 
     return NULL; 
    } 

    pthread_mutex_init(buffer->mutex, NULL); 

    // etc. 
    return buffer; 
} 

在后者的情况下,不要忘记free()互斥如以及在“破坏者”中。

另外,don't cast the return value of malloc()

4

你的结构定义更改为

pthread_mutex_init(&buffer->mutex, NULL); 

你的代码是用在两种情况下未初始化的指针。在第二种情况下不立即导致分段错误纯属运气,它可能会破坏一些变量并在稍后造成麻烦。

0

你正在传入一个未初始化的缓冲区....你已经分配了buffer_t,但是初始化为空。所以互斥指针是一些指向谁知道在哪里的随机值。

然后,pthread_mutex_init需要一个指向实际存在的互斥量的指针。你将它传递给随机存储器的指针。

看看这不能解决问题......

typedef struct { 
    pthread_mutex_t mutex; 
} buffer_t; 


buffer_t *buffer_alloc(unsigned int maxSize) { 

    buffer_t *buffer = (buffer_t *) malloc(sizeof(buffer_t)); 
    if(buffer == NULL) 
     return NULL; 

    pthread_mutex_init(&buffer->mutex, NULL); // This line causes a crash