-4

関数 *producer のスレッドを作成しようとしていますが、スレッドを作成するための行がエラーで表示されます。線にスターを付けましたが、何が問題なのかわかりません...

#include <pthread.h>
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/time.h>

#define TOTALLOOPS 100                              /*Num of loops run*/
#define NUMOFPAIRS 4 /*For each 1 it produces 1 consumer and 1 producer*/

typedef struct {
    int q[NUMOFPAIRS];
    int head;
    int tail;
    int full;
    int empty;
    pthread_mutex_t mut;                       /*Creates a mutex Lock*/
    pthread_cond_t notFull;                     /*Creates conditional*/
}Queue;

int main(void)
{
    Queue buf;              /* Declare and initialize parts of struct */
    buf.head = 0;
    buf.tail = 0;
    buf.full = 0;
    buf.empty = 0;
    pthread_mutex_init(&buf.mut, NULL);/*intitializes mutex for struct*/
    //pthread_cond_init(&buf.nutFull, NULL);

    pthread_t pro;
    **pthread_create(&pro, NULL, producer, &buf);**


    pthread_mutex_destroy(&buf.mut);
    return 0;
}

void *producer(int x, Queue *buf){
    int id = x;
    int i;

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

        while(buf->full == 1){
            //do nothing
        }
        mClock();
        printf(" - Producer%d:\n",  id);
    }
}

void* consumer(int x, Queue *buf){
    int id = x;
    int i;

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

        while(buf->empty == 1){
            //do nothing
        }
        mClock();
        printf(" - Consumer%d:\n",  id);
    }
}

void addToQueue(Queue *buf, int x){
    //Checks if empty flag is triggered, if so un triggers
    if(buf->empty) buf->empty = 0;

    buf->q[buf->tail] = x;
    if(buf->tail == 3) buf->tail = 0;  /*Resets to beginning if at end*/
    else buf->tail += 1;                     /*else just moves to next*/

    //Checks if full flag needs to be triggered, if so triggers
    if(buf->tail == buf->head) buf->full = 1;
}

int removeFromQueue(Queue *buf){
    int t;                                   /*return value from queue*/

    //Checks if full flag is triggered, if so un triggers
    if(buf->full == 1)buf->full = 0;

    t = buf->q[buf->head];
    if(buf->head == 3) buf->head = 0;  /*Resets to beginning if at end*/
    else buf->head += 1;                     /*else just moves to next*/

    //Checks if full flag needs to be triggered, if so triggers
    if(buf->tail == buf->head) buf->empty = 1;

    return t;
}

void mClock(){
    struct timeval tv;
    gettimeofday(&tv,NULL);
    long time_in_micros = 1000000 * tv.tv_sec + tv.tv_usec;
    printf("%u", time_in_micros);
}
4

2 に答える 2

1

pthread_create 呼び出しの前にプロデューサーを宣言する必要があります。

void *producer(int x, Queue *buf);

最初に表示されるはずです。

同様に、mClock を最初に宣言する必要があります。

また、関数は引数を 1 つだけ取る必要があります。

于 2013-10-23T23:31:34.803 に答える
0

構造体のどこでイニシャライザpthread_mutex_t mutを呼び出しているのかわかりません。pthread_cond_t notFull

また、関数の宣言の順序を変更するか、ファイルの先頭にプロトタイプを追加する必要があります。

于 2013-10-23T23:31:24.147 に答える