2013-11-16 2 views
0

Я успешно использовал статический мьютекс, но у меня проблема с динамической версией. В выводе переменная должна быть равна нулю. Пожалуйста, помогите. Есть ли лучший способ написать это?Mutex dynamic выделено

#include<stdio.h> 
#include<stdlib.h> 
#include<pthread.h> 
#define N 20 

int beers=20; 

void* drink(void*); 

//pthread_mutex_t lockk = PTHREAD_MUTEX_INITIALIZER; 
typedef struct st1{ 
    pthread_mutex_t mutex; 
    int val; 
}my_struct_t; 

int main(){ 
    pthread_t th[N]; 
    int i; 
    void* return_val; 

    my_struct_t *data; 
    data = malloc(sizeof(my_struct_t)); 
    data->val = 20; 
    pthread_mutex_init(&data->mutex,NULL); 

    for(i=0;i<N;i++) 
    pthread_create(&th[i], NULL, drink, &data); 
    for(i=0;i<N;i++) 
    pthread_join(th[i], &return_val); 
    pthread_mutex_destroy(&data->mutex); 
    printf("%d\n", beers); 
} 

void* drink(void* p){ 
    int i; 
    my_struct_t *data = (my_struct_t *)p; 
    pthread_mutex_lock(&data->mutex); 
    beers--; 
    pthread_mutex_unlock(&data->mutex); 

    //} 
    return NULL; 
} 

Где я получил отказ? :)

+1

.. быть последовательным на отступа? –

ответ

2

Там проблема здесь:

pthread_create(&th[i], NULL, drink, &data); 

можно передать адрес указателя data, поэтому тип my_struct_t**, но рассматривая его как my_struct_t* в функции drink. Удалите в вызывающем абоненте &, и код должен работать.

Пожалуйста, сделайте некоторую очистку, хотя. У вас есть неиспользуемые переменные, определить N, но не использовать его при инициализации beer и data->val, инициализации data->val, но никогда не использовать его ...

Смежные вопросы