RISOLTO [C] Threads - esercizio

Stato
Discussione chiusa ad ulteriori risposte.

Chairae

Nuovo Utente
8
0
Hardware Utente
CPU
Intel(R) Core(TM) i7-8750H CPU @ 2.20GHz
RAM
16,0 GB
Scheda Video
NVIDIA GeForce GTX 1070 with Max-Q Design
Sistema Operativo
Windows 10
Salve, mi sto approcciando per la prima volta ai threads usando C e non riesco a venirne a capo, per quanto provi non viene stampato nulla a schermo. L'esercizio in questione è questo qui:

Si realizzi un programma C per la creazione di due Thread concorrenti che, utilizzando la stessa thread function, stampino rispettivamente N numeri ed M lettere scelte casualmente.

Il mio codice (non ho inserito la parte di stampa delle lettere, ma dovrebbe comunque stamparmi i numeri):

Codice:
#include <stdio.h>
#include <pthread.h>
#include <stdlib.h>
#include <time.h>
#include <unistd.h>
#define N 5
#define M 7

struct print_params{
    int type;
};

void* print_type(void* parameters){
    struct print_params* pp = (struct print_params*) parameters;
    if(pp->type == 0){
        time_t t;
        int array[N];
        srand((unsigned) time(&t));

           for( int i = 0 ; i < 5 ; i++ ) {
                  array[i] = (rand() % 50);
            printf("%d ", array[i]);
            fflush(stdout);
            sleep(1);
           }
    }
    if(pp->type == 1){
        //stampa lettere casuali
    }
    return (void*) &(pp->type);
}

int main(){
    pthread_t t1_id;
    pthread_t t2_id;
    
    struct print_params t1_args;
    t1_args.type = 0;

    struct print_params t2_args;
    t2_args.type = 1;

    pthread_create(&t1_id, NULL, &print_type, &t1_args);
    pthread_create(&t2_id, NULL, &print_type, &t2_args);
    return 0;
}
 
Ultima modifica:

_Achille

Utente Èlite
3,003
690
Hardware Utente
CPU
Intel i5-6600K @4.6 GHz
Dissipatore
Cryorig H5
Scheda Madre
ASRock Z170 Extreme 6
Hard Disk
WesternDigital 1TB & Crucial MX200 250GB
RAM
Corsair Ven 16GB DDR4 2133MHz
Scheda Video
Sapphire RX 580 Nitro+
Monitor
Dell S2418H
Alimentatore
RM550X
Case
NZXT S340
Periferiche
Cooler Master XT; Razer Abyssus
Sistema Operativo
Windows 10 Pro
Quale è il problema?
Comunque srand() va chiamato una sola volta nella esecuzione del programma. Poi nel cast da void* a Type* puoi evitare di segnarlo esplicitamente (e anzi è consigliato) essendo codice C e non C++.
Infine non utilizzi N e M
 
  • Mi piace
Reactions: Chairae

Chairae

Nuovo Utente
8
0
Hardware Utente
CPU
Intel(R) Core(TM) i7-8750H CPU @ 2.20GHz
RAM
16,0 GB
Scheda Video
NVIDIA GeForce GTX 1070 with Max-Q Design
Sistema Operativo
Windows 10
Quale è il problema?
Comunque srand() va chiamato una sola volta nella esecuzione del programma. Poi nel cast da void* a Type* puoi evitare di segnarlo esplicitamente (e anzi è consigliato) essendo codice C e non C++.
Infine non utilizzi N e M
Hey ciao! Innanzitutto grazie per i suggerimenti, non tocco C da quasi 5 anni e sono abbastanza arrugginita quindi non posso altro che fare tesoro di questi suggerimenti. Quanto ad N e M per adesso non è un problema, li cambierò alla fine.
Il problema principale al momento è che, una volta eseguito, non spunta assolutamente nulla a schermo. Nessun numero, nessuna lettera.
Ho provato a creare due variabili s1 ed s2 che ho posto uguali a pthread_create per fare un controllo (se != 0 allora errore), e tutto va bene. Ho anche isolato la funzione e, brutalmente, l'ho lanciata direttamente dal main e anche quella funzionava. Non riesco proprio a capire perché non stampi i caratteri a schermo.
 

Andretti60

Utente Èlite
3,535
2,363
Hardware Utente
Controlla il valore di ritorno di pthread_create, deve essere 0 altrimenti è il codice di errore.
Ho visto che lo hai fatto, scusa.
Il problema è che il main() fa partire I thread ma poi termina subito, quindi tutto il processo. Nel main() prima del return devi accettarti che I thread da te creati abbiano finito il loro lavoro.
 

Ibernato

Utente Èlite
3,910
1,751
Hardware Utente
Sistema Operativo
Windows 10 Pro
Come dice @Andretti60 , devi inserire questa chiamata pthread_join(thread_id, NULL);
altrimenti il main ritorna subito. Ne occorrono due, dato che i thread sono 2. Le puoi mettere o dopo le chiamate di pthread_create o dopo la singola chiamata di pthread_create.
Cosa cambia? Fai la prova e vedi :)
 
  • Mi piace
Reactions: Chairae

Chairae

Nuovo Utente
8
0
Hardware Utente
CPU
Intel(R) Core(TM) i7-8750H CPU @ 2.20GHz
RAM
16,0 GB
Scheda Video
NVIDIA GeForce GTX 1070 with Max-Q Design
Sistema Operativo
Windows 10
Come dice @Andretti60 , devi inserire questa chiamata pthread_join(thread_id, NULL);
altrimenti il main ritorna subito. Ne occorrono due, dato che i thread sono 2. Le puoi mettere o dopo le chiamate di pthread_create o dopo la singola chiamata di pthread_create.
Cosa cambia? Fai la prova e vedi :)
!
Grazie mille!
 
Stato
Discussione chiusa ad ulteriori risposte.

Entra

oppure Accedi utilizzando