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]
謝謝,看來我很累......如果我錯過了那個錯字:\ –
避免在累了的時候進行多線程編程。多線程編程需要大量的關注和關注。只有在狀態良好的情況下才能這樣做...... –
ty,因爲我知道我嘗試瞭解它,或者至少能夠捕捉到這種類型編程的過程/概念。 –