Функция Pthread не печатает

Я пытаюсь создать туннель и автомобильные нити, которые имитируют туннель, который идет только в одну сторону. Допустим, каждый путь - это W и B. Путь к W открыт на 5 секунд, затем туннель закрывается еще на 5, затем туннель открывается на путь B на 5 секунд, а затем закрывается еще на 5, затем повторите.

Я создал туннельный поток с функцией tunnelf, но он ничего не делает, кроме печати первой строки: "Туннель теперь открыт для трафика, связанного с Уиттиером". И это только иногда делает это. Каждый раз, когда я компилирую код, он может либо ничего не печатать, ни эту строку. Он не проходит через необходимые выходы. Между тем, если я помещаю точно такой же цикл while из потока tunnelf в main, он работает

#include <iostream>
#include <cstring>
#include <string>
#include <cctype>
#include <iomanip>
#include <fstream>
#include <sstream>
#include <pthread.h>
#include <conio.h>
#include <windows.h>
#include <ctime>
#include <cerrno>
#include <unistd.h>
using namespace std;
void *car(void *arg);
void *tunnelf();
static pthread_mutex_t traffic_lock = PTHREAD_MUTEX_INITIALIZER;
static pthread_mutex_t car_lock = PTHREAD_MUTEX_INITIALIZER;

static pthread_cond_t bbcan = PTHREAD_COND_INITIALIZER;
static pthread_cond_t wbcan =PTHREAD_COND_INITIALIZER;
static pthread_cond_t not_full = PTHREAD_COND_INITIALIZER;
static bool whittierBound = false;
static bool bbBound = false;

struct car2{
    int arrive;
    int cross;
    string bound;
};

int main(){
    ifstream in;
    in.open("Thrd.txt");
    if (in.fail()){
        cout<< "failed to open file";
        exit(1);
    }
    car2 record[50];
    int max_cars;
    int arrive;
    int cross;
    string bound;
    string data;
    int i = 0;
    in >> max_cars;
    cout<<"Num cars "<<max_cars<<endl;
    while(!in.eof()){
        in >> record[i].arrive >>record[i].bound >> record[i].cross;
        i++;
    }
    int size = i;
    for(int i= 0; i<size; i++){
        cout << record[i].arrive <<record[i].bound <<record[i].cross<<endl;
    }
    pthread_t cartid[max_cars];
    pthread_t tunnel;//just shared variable for the tunnel
    pthread_create(&tunnel, NULL, &tunnelf, NULL);
    in.close();
}

void *tunnelf(){
    static int done;
    while(done==0){
        pthread_mutex_lock(&traffic_lock);
        whittierBound = true;

        cout << "The tunnel is now open to Whiitier-bound traffic"<<endl;
        pthread_cond_broadcast(&wbcan);
        pthread_mutex_unlock(&traffic_lock);
        sleep(5);

        pthread_mutex_lock(&traffic_lock);
        whittierBound = false;
        cout << "The tunnel is now closed to all traffic"<<endl;
        pthread_mutex_unlock(&traffic_lock);
        sleep(5);

        pthread_mutex_lock(&traffic_lock);
        bbBound = true;
        cout << "The tunnel is now open to Bear-Valley-bound traffic"<<endl;
        pthread_cond_broadcast(&bbcan);
        pthread_mutex_unlock(&traffic_lock);
        sleep(5);

        pthread_mutex_lock(&traffic_lock);
        bbBound = false;
        cout << "The tunnel is now closed to all traffic"<<endl;
        pthread_mutex_unlock(&traffic_lock);

    }   
}

1 ответ

Стоит упомянуть, что вы никогда не защититесь от переполнения массива. В C++17 вы можете использовать std::size. Вы можете рассмотреть возможность использования std::array для записи, что поможет в отладочных сборках (но не в выпуске)

while(!in.eof() && i<std::size(record)){
    in >> record[i].arrive >>record[i].bound >> record[i].cross;
//      cout <<arrive<<" " << bound<<" " << cross<<endl;
    i++;
}
Другие вопросы по тегам