由两个线程类共享的 Posix pthread_cond_t不起作用

Posix pthread_cond_t shared by two thread classes doesn't work

本文关键字:pthread Posix cond 不起作用 共享 线程 两个      更新时间:2023-10-16

我有两个类评估线程,但我无法从一个类发送到另一个类,为什么它不起作用的一些想法:

第 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 未接收信号

每个翻译单元都有自己的brak_biletow_treshold实例,因为您已将它们声明为static(这有效地将范围限制为当前翻译单元(。

您需要更改声明和访问"全局变量"的方式。我建议你将条件传递给两个类的构造函数。

这是因为包含头文件的每个 C 源文件都会获得自己的静态变量副本。它们不会在翻译单元之间共享。

互斥体似乎只起作用,因为它们在这种情况下的操作是不会相互影响。对于互斥锁,它看起来一直工作到您的数据损坏为止。

对于条件变量,分离意味着它看起来不像在工作,实际上也不是。

一种解决方案是在头文件声明中将它们标记为extern,并在某处 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;