0

スレッドを評価した 2 つのクラスがありますが、あるスレッドから別のスレッドにシグナルを送信できません。うまくいかない理由のいくつかのアイデア:

クラス 1:

#include "timer.h"
#include <ncurses.h>
#include <stdlib.h>
#include <time.h>
#include <unistd.h>
#include "mutexy.h"

Timer::Timer() {
}

Timer::~Timer() {
}

void Timer::startThread() {
    pthread_create(&thread, NULL, runInstance, reinterpret_cast<void *>(this));
}

void Timer::joinThread() {
    pthread_join(thread, NULL);
}

void Timer::init() {
    this->hh = 0;
    this->day = 1;
    this->month = 1;
    this->year = 2011;
}

void Timer::run() {
    while(true) 
    {
        if(hh==24) {
            hh = 0;
            day++;
            if(day==31) {
                day=1;
                month++;
                if(month==13) {
                    year++;
                    month==1;
                }
            }
        }
        for (int i=0; i<10; i++) {
            if(hh==7) {
                hh=20;
                pthread_cond_signal(&brak_biletow_treshold);
            }
        }

        sleep(1);
        hh++;
        pthread_yield();
    }
}

void* Timer::runInstance(void *instance) {
    Timer *d = reinterpret_cast<Timer *>(instance);

    d->run();

    return NULL;
}

クラス2:

#include "flight_list.h"
#include <ncurses.h>
#include <stdlib.h>
#include <time.h>
#include <unistd.h>
#include "mutexy.h"

string cities[8] = {"Warszawa","Berlin","Paryz","Londyn","Dublin","Madryt","Wieden","Moskwa"};


FlightList::FlightList() {
    srand(time(NULL));
}

FlightList::~FlightList() {
}

void FlightList::startThread() {
    pthread_create(&thread, NULL, runInstance, reinterpret_cast<void *>(this));
}

void FlightList::joinThread() {
    pthread_join(thread, NULL);
}

void FlightList::init() {
    flightTab = new Flight *[10];
    for (int i=0; i<10; i++) {
        int city = rand()%7+1;
        flightTab[i] = new Flight(i*2+2,i+2,1,2011,60,cities[0],cities[city]); 
    }
}

void FlightList::run() {
    while(true) 
    {
        pthread_mutex_lock(&bilety_mutex);
        pthread_cond_wait(&brak_biletow_treshold, &bilety_mutex);
        for (int i=0; i<10; i++) {
                for(int i=0; i<9; i++)
                    flightTab[i] = flightTab[i+1];
                int city = rand()%7+1;
                flightTab[9] = new Flight(4,10,2,2011,60,cities[0],cities[city]); 

        }
        pthread_mutex_unlock(&bilety_mutex);
        pthread_yield();
    }
}

void* FlightList::runInstance(void *instance) {
    FlightList *d = reinterpret_cast<FlightList *>(instance);

    d->run();

    return NULL;
}

およびミューテックスと cond_t を含むヘッダー ファイル:

#include <pthread.h>

static pthread_mutex_t bilety_mutex;
static pthread_mutex_t loty_mutex;
static pthread_cond_t brak_biletow_treshold = PTHREAD_COND_INITIALIZER

;

ミューテックスは機能していますが、シグナルはスレッドによって受信されません:S

4

2 に答える 2

2

各翻訳単位は、宣言したため、独自のbrak_biletow_tresholdインスタンスを持ちますstatic(これにより、スコープが現在の翻訳単位に効果的に制限されます)。

「グローバル」の宣言方法とアクセス方法を変更する必要があります。条件を 2 つのクラスのコンストラクターに渡すことをお勧めします。

于 2012-05-21T11:37:28.053 に答える
1

これは、ヘッダー ファイルを含むすべての C ソース ファイルが、静的変数の独自のコピーを取得するためです。それらは翻訳単位間で共有されません。

その場合のアクションは相互に影響を与えないため、ミューテックスは機能しているように見えます。ミューテックスの場合、データが破損するまで機能しているように見えます。

条件変数の場合、分離は機能しているようには見えず、実際には機能していないことを意味します。

extern1 つの解決策は、ヘッダー ファイル宣言でそれらをマークし、C ファイルのどこかに定義することです。

my_thread_stuff.h:
    extern pthread_mutex_t bilety_mutex;
    extern pthread_mutex_t loty_mutex;
    extern pthread_cond_t brak_biletow_treshold;

global_thread_stuff.c:
    #include "my_thread_stuff.h"
    pthread_mutex_t bilety_mutex;
    pthread_mutex_t loty_mutex;
    pthread_cond_t brak_biletow_treshold = PTHREAD_COND_INITIALIZER;
于 2012-05-21T11:37:50.700 に答える