2012-12-01 59 views
0

您好我正在休學一個pthreading的教程,但是由於無法通過 pthread_create(...,(void* stuctName))來引用我的結構,所以我在尋找一些建議還是因爲我修復不知道在哪裏還是什麼我搞砸了...... 代碼:傳遞pthread函數的結構指針als參數

#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

使用inData->root而不是data->root等...(鄰因爲data是一個void*指針,它是指向某些未指定的數據類型的指針,因此它總是明確地施展您的data)。

+0

謝謝,看來我很累......如果我錯過了那個錯字:\ –

+0

避免在累了的時候進行多線程編程。多線程編程需要大量的關注和關注。只有在狀態良好的情況下才能這樣做...... –

+0

ty,因爲我知道我嘗試瞭解它,或者至少能夠捕捉到這種類型編程的過程/概念。 –