Я создаю программу для практики с использованием потоков. Я пытаюсь назвать их так, что, когда программа запущена, вы можете четко видеть, что "Рейс 1 взлетает..." или "Рейс 6 - это посадка..." и так далее. Я бы хотел, чтобы каждый поток имел flyTime (поэтому я знаю, в каком порядке они будут использовать ВПП), который будет генерироваться случайным образом. Я пробовал и с трудом использую struct/typedef, чтобы дать каждому pthread эти характеристики, поэтому я могу сказать, например, flight.flyTime и использовать его во всей программе. Вот соответствующая часть моего кода без моих функций посадки/взлета:
#include <pthread.h>
#include <stdio.h>
#include <cstdlib>
#include <iostream>
#include <queue>
#define NUM_THREADS 8 //8 flights
pthread_mutex_t runway1lock;
void *FlightID(void *flightid){
long fid;
fid = (long)flightid;
pthread_exit(NULL);
}
typedef struct{ //each plane has these characteristics
long fid;
int StartState; // if start=1 ==> taking off:::if start=2 ==> landing
int flyTime; //fly == randomly generated time (order)
}FLIGHTS;
FLIGHTS flights[NUM_THREADS];
int StartState(flights[NUM_THREADS]){
int startState;
for (int i=0; i<=NUM_THREADS; i++){
startState = rand() % 1+2;
}
std::string start;
if(startState == 1){
start = "Taking off";
}
if(startState == 2){
start = "Landing";
}
for (int t=0; t<NUM_THREADS; t++){
std::cout << "Start State for Flight# " << FlightID << " is " << start << std::endl;
}
return startState;
}
int main(int argc, char *argv[]){
// pthread_t flights[NUM_THREADS]; //pthread_t keeps a thread ID after the thread is created with pthread_create()
//it like an index on a vector of threads
int rc;
long t;
for (t=1; t<=NUM_THREADS; t++){ //loop creates threads(flights)
printf("In main: Creating flight %1d\n", t);
rc = pthread_create(&flights[t], NULL, FlightID, (void *)t);
if (rc){
printf("ERROR: return code from pthread_create() is %d\n", rc);
return (-1);
}
printf("Created flight %1d\n", t);
StartState(flights[t]); //gives every flight a start state
if(StartState(flights[t])==1){
std::cout << "Flight # " << &flights[t] << " is listed as waiting at the gate." << std::endl;
//go to takeoff function and go through switch case
}
if(StartState(flights[t])==2){'enter code here'
std::cout << "Flight # " << &flights[t] << " is listed as waiting to land." << std::endl;
//go to landing function and go through switch case
}
}
pthread_exit(NULL);
}
Ниже приведен фрагмент кода, который представляет, как я его реализую.
Вы также должны взглянуть на pthread_key_create, pthread_getspecific и pthread_setspecific. Это набор функций, которые позволяют вам иметь данные, относящиеся к каждому потоку, хранящиеся в контексте памяти потоков. Это может пригодиться в вашем коде позже.
typedef struct{
long fid;
int StartState;
int flyTime;
} FLIGHTS;
FLIGHTS** flights = new FLIGHTS*[NUM_THREADS];
pthread_key_t pkey:
void *FlightID(void *flightid){
long fid;
fid = (long)flightid;
FLIGHTS* flight = new FLIGHTS();
flight->fid = fid;
flights[fid] = flight;
pthread_setspecific(pkey, flight);
int startState;
for (int i=0; i<=NUM_THREADS; i++){
startState = rand() % 1+2;
}
std::string start;
if(startState == 1){
start = "Taking off";
}
if(startState == 2){
start = "Landing";
}
for (int t=0; t<NUM_THREADS; t++){
std::cout << "Start State for Flight# " << fid << " is " << start << std::endl;
}
flight->StartState = startState;
}
int main(int argc, char* argv[]) {
pthread_key_create(&pkey, NULL);
for (t=1; t<=NUM_THREADS; t++){
rc = pthread_create(&flights[t], NULL, FlightID, (void *)t);
if (rc){
printf("ERROR: return code from pthread_create() is %d\n", rc);
return (-1);
}
printf("Created flight %1d\n", t);
}
}
Кроме того, я не знаю, правильно ли я понимаю ваш код или если у вас просто есть ошибки кодирования, поэтому я оставляю вам некоторые вопросы или замечания, которые могут быть ошибками/ошибками:
1) Вы вызываете pthread_exit в функции обратного вызова start:
void *FlightID(void *flightid){
long fid;
fid = (long)flightid;
pthread_exit(NULL);
}
2) Вы передаете оператор << с функцией без возвращаемого значения:
std::cout << "Start State for Flight# " << FlightID << " is " << start << std::endl;
3) Вы вызываете ту же функцию 3 раза, чтобы получить возвращаемое значение. Разве это не должно быть int state = StartState (полеты [i]), а затем проверить значение переменной состояния? StartState (рейсы [т]); // дает каждому полету состояние начала
if(StartState(flights[t])==1){
std::cout << "Flight # " << &flights[t] << " is listed as waiting at the gate." << std::endl;
//go to takeoff function and go through switch case
}
if(StartState(flights[t])==2){'enter code here'
std::cout << "Flight # " << &flights[t] << " is listed as waiting to land." << std::endl;
//go to landing function and go through switch case
}
4) Вы не можете определить такую функцию:
int StartState(flights[NUM_THREADS]){