为pthread函数传递struct指针als参数

时间:2012-12-01 19:28:44

标签: linux pthreads pass-by-reference

您好我正在阅读pthreading的教程,但是在路上出了点问题,因为无法通过以下方式引用我的struct pthread_create(...,(void* stuctName)),我正在寻找一些建议或修复,因为我不知道我搞砸了哪里或什么... 代码:

#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#include <unistd.h>
#include <math.h>

struct dataBlock{
    struct node *root;
    int listSize;
    int forIndex;
};

struct node { // std linked list node
    int value;
    int worker;
    struct node *next;
};

int slots = 3; // only 3 threads are allowed to access the list
int availableCheck(){   // check if thread can acces the list
    if(slots < 3) return 0;
    else return -1;
}

pthread_mutex_t mutp = PTHREAD_MUTEX_INITIALIZER;   //condvar mutex
pthread_cond_t  condvar = PTHREAD_COND_INITIALIZER;   //condvar

void * worker( void *data ){ //WORKER FUNCTION
    printf( "* Thread start:            ^\n"); 
    struct dataBlock *inData = (struct dataBlock *) data;
    struct node *root = data->root;
    int listSize =  data->listSize;
    int forIndex = data ->forIndex;

    // printf( "    * I am %li _ worker  # %li : \n", forIndex, pthread_self() );

    pthread_mutex_lock( &mutp );
    if(availableCheck() < 0){
        printf( " ^^^ List not available yet... \n" ); 
        pthread_cond_wait( &condvar, &mutp );
    }
    // printf( "*        Got data:  %lu \n", index ); 
    pthread_cond_signal( &condvar ); // 
    pthread_mutex_unlock( &mutp ); 

    return NULL;
}

int main( int argc, char *argv[] ){
    if ( argc != 3 ){
        printf( "Programm must be called with \n NR of elements and NR of workers! \n " );
        exit( 1 );
    int i;
    struct node *root;
    struct node *iterator;  

//prepare list for task
    int listSize = atoi(argv[1]);
    int nrWorkers = atoi(argv[2]);
    root = malloc(sizeof( struct node) );
    root->value = rand() % 100;
    root->worker = 0;
    iterator = root;
    for( i=1; i<listSize; i++ ){
        iterator->next = malloc(sizeof(struct node));
        iterator = iterator->next;
        iterator->value = rand() % 100;
        iterator->worker = i % nrWorkers;
        printf("node #%d worker: %d  value: %d\n", i, iterator->worker,iterator->value);
    }

// Create all threads to parse the link list
    int ret, *id;   
    printf("workersInput: %d\n",nrWorkers);

    pthread_t w_thread;
    pthread_t* w_threads = malloc(nrWorkers * sizeof(w_thread));

    struct dataBlock *data = malloc(sizeof(struct dataBlock));
    data->root = root;
    data->listSize = listSize;

    for( i=0; i < nrWorkers; i++ ){ // CREATING THREADS
        data->forIndex = i;
        ret = pthread_create ( &w_threads[i], NULL, worker, (void *) data );
        if( ret ) {
            perror("Thread creation fail");
            exit(2);    
        }   
    } 
    for ( i = 0; i < nrWorkers; i++){
        pthread_join(w_threads[i],NULL);
    }
    free(root);
    free(iterator);
    return 0;
}

编译(墙标志)

s.c: In function ‘worker’:
s.c:32:26: warning: dereferencing ‘void *’ pointer [enabled by default]
s.c:32:26: error: request for member ‘root’ in something not a structure or union
s.c:33:22: warning: dereferencing ‘void *’ pointer [enabled by default]
s.c:33:22: error: request for member ‘listSize’ in something not a structure or union
s.c:34:22: warning: dereferencing ‘void *’ pointer [enabled by default]
s.c:34:22: error: request for member ‘forIndex’ in something not a structure or union
s.c:34:6: warning: unused variable ‘forIndex’ [-Wunused-variable]
s.c:33:6: warning: unused variable ‘listSize’ [-Wunused-variable]
s.c:32:15: warning: unused variable ‘root’ [-Wunused-variable]
s.c:31:20: warning: unused variable ‘inData’ [-Wunused-variable]
s.c: In function ‘main’:
s.c:81:12: warning: variable ‘id’ set but not used [-Wunused-but-set-variable]

1 个答案:

答案 0 :(得分:1)

使用inData->root代替data->root等...(或明确指定您的data),因为datavoid*指针,即指向某些未指定的数据类型。