2017-12-17 21 views
-2

Ich versuche, klassisches Producer - Consumer - Programm mit der Verwendung der Monitor - Klasse zu schreiben, die von meiner Lehrer - und Pthreads - Bibliothek bereitgestellt wird. Ich denke, dass ich Logik hinter meinem einfachen Algorithmus habe, aber damit es funktioniert, muss ich im Auge behalten, wie viele Elemente sich gerade im Puffer befinden. Ich weiß nicht warum, aber die Variable, die für diesen Wert verantwortlich ist, erhält einen zufälligen Wert, selbst wenn ich ihn (zusammen mit zwei anderen Variablen) im Konstruktor auf Null setze. Könnte irgendjemand auf den Fehler hinweisen, den ich mache? (Monitor-Bibliothek von Lehrer stellt enter() und leave() Funktionen zur Verfügung, die sicherstellen, dass nur ein Thread auf Daten zwischen ihnen zugreift und Condition-Klasse, die Zustandsvariablen bietet, die Sie wait() und signal() ausführen können - wie in normal monitor)Mitgliedsvariable erhält einen zufälligen Wert, auch wenn ich es im Konstruktor initialisiere - warum?

main.cpp:

#include <stdio.h> 
#include <pthread.h> 
#include "mybuffer.h" 

void* client (void* parameters) 
{ 
    MyBuffer *p = (MyBuffer *) parameters; 
    char whatsinthebox; 
    int loop_counter = 0; 
    while(loop_counter < 5) { 
    printf("Client loop nr: %d\n",loop_counter); 
    whatsinthebox = p->Pop(); 
    printf("Product recieved: %c\n", whatsinthebox); 
    sleep(5); 
    loop_counter++; 

    } 
} 

void* producer (void* parameters) 
{ 
    MyBuffer *p = (MyBuffer *) parameters; 
    int loop_counter = 0; 
    char product = 'X'; 
    while(loop_counter<20) { 
    printf("Producer loop nr: %d\n",loop_counter); 
    p->Push(product); 
    printf("Product inserted: %c\n", product); 
    sleep(1); 
    loop_counter++; 
    } 
} 


int main() 
{ 
    MyBuffer *just_buffer = new MyBuffer(); 
    pthread_t thread1_id; 
    pthread_t thread2_id; 

    pthread_create (&thread1_id, NULL, &producer, &just_buffer); 
    pthread_create (&thread2_id, NULL, &client, &just_buffer); 

    pthread_join (thread1_id, NULL); 
    pthread_join (thread2_id, NULL); 

    delete just_buffer; 
    return 0; 
} 

mybuffer.h:

#ifndef MYBUFFER_H 
#define MYBUFFER_H 

#define MAX_ELEMENTS 9 
#define BUFFER_SIZE (MAX_ELEMENTS+1) 

#include "monitor.h" 

class MyBuffer: public Monitor 
{ 
private: 

    int data_in, data_out, elements_count; 
    char data[BUFFER_SIZE]; 
    Condition full, empty; 

public: 

    MyBuffer() 
    { 
    enter(); 
    data_in = data_out = 0; 
    elements_count = 0; 
    leave(); 
    } 

    int Push(char c) 
    { 
    enter(); 
    printf("Elements count before conditon in Push: %d\n",elements_count); 
    printf("data_in before conditon in Push: %d\n",data_in); 
    printf("data_out count before conditon in Push: %d\n",data_out); 
    if (elements_count == MAX_ELEMENTS) 
     wait(full); // queue full - can't push 
    data[data_in] = c; 
    data_in = (data_in + 1) % BUFFER_SIZE; 
    elements_count++; 
    if (elements_count == 1) 
     signal(empty); 
    leave(); 
    return 0; // no errors 
    } 

    char Pop() 
    { 
    char value; 
    enter();  
    if (elements_count == 0) 
     wait(empty); // queue empty - nothing to pop 
    value = data[data_out]; 
    data_out = (data_out + 1) % BUFFER_SIZE; 
    elements_count--; 
    if (elements_count == MAX_ELEMENTS - 1) 
     signal(full); 
    leave(); 
    return value; 
    } 
}; 

#endif 
+0

Mein Fehler in vorbei 4. Argument war pthread_create als Referenz - wenn es schon ein Zeiger war. – Soonmoon

Antwort

0

Mein Fehler war in der 4. Argument übergeben als Verweis auf pthread_create - wenn es bereits ein Zeiger war..

Also sollte ich entweder passi es ohne & wie folgt aus:

pthread_create (&thread1_id, NULL, &producer, just_buffer); 

Oder einfach nur normale Objekt meiner Klasse definieren statt Zeiger wie folgt aus:

MyBuffer just_buffer; 
Verwandte Themen