2013-03-26 82 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