0

このコードを書くために、私はいくつかのチュートリアルをチェックして使用しましたが、メイン関数だけが機能し、コード0で終了することを考えると、まだどこかで失敗しました。トレッドは作成されていませんか?それらは、どういうわけか、それらを私の「作業」機能にリンクできませんでしたか?

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


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

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 *i ){
    long index = (long)i;
    printf( "    * I am worker  # %lu : \n",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,listSize,workersSize;
    struct node *root;
    struct node *iterator;  

//prepare list for task
    listSize = atoi(argv[1]);
    root = malloc(sizeof( struct node) );

    root->value = rand() % 100;
    // printf(">>> %d\n", root->value );
    root->worker = 0;

    iterator = malloc(sizeof(struct node) );
    iterator = root;

    for( i=1; i<listSize; i++ ){
        iterator->next = malloc(sizeof(struct node));
        iterator = iterator->next;
        iterator->value = rand() % 100;
        iterator->worker = i;
        printf("node #%d worker: %d  value: %d\n", i, iterator->worker,iterator->value);
    }
    printf("? List got populated\n");

// Create all threads to parse the link list
    int ret;    
    pthread_t w_thread;
    int nrWorkers = atoi(argv[2]);
    pthread_t* w_threads = malloc(nrWorkers * sizeof(w_thread));
    for( i=0; i<listSize; i++ ){
        int *id = malloc(sizeof(int));
        *id = i;
         ret = pthread_create ( &w_threads[i], NULL, worker, (void *) &id );
         if( ret ) {
            perror("Thread creation fail");
            exit(2);    
        }
    } 
    int j;
    for (j = 0; i < nrWorkers; j++){
        pthread_join(w_threads[j],NULL);
    }       
}

コメントされた関数/変数のいくつかは使用/実装されますが、この時点で私はスレッドを期待しています

4

1 に答える 1

2

スレッドを作成しているforループでは、次のようにする必要があると思います。

 for( i=0; i<nWorkers; i++ ){

また、入力引数のチェック/プリントを追加することをお勧めします。

そしてもう1つの問題:ポインターをworker()に渡すので、ポインターを逆参照する必要があります。それがintへのポインターである場合は、

void * worker( void *p_int ){
    assert(p_int != NULL)   
    int index = *(int*)p_ind;

ボイド*からキャストする場合は正確に行ってください。

そして最後にもう1つ。listSizeを知っている場合、なぜリンクリストを作成しようとしているのかはわかりません。

for( i=1; i<listSize; i++ ){
    iterator->next = malloc(sizeof(struct node));
    iterator = iterator->next;
    ...

代わりに、1行のコードで配列を割り当てることができ、 rootに割り当てる必要はありません。

p_list = (struct node*)malloc(listSize*sizeof(struct node));
assert(p_list);
for( i=0; i<listSize; i++ ){
    p_list[i].value = ...
    ...

ご覧のとおり、ここでは次のポインタは必要ありません。

于 2012-11-30T22:37:46.163 に答える