Non ti ho risposto prima perche' "non ci avevo capito un'acciderbolina"
MA
ora ho letto una cosa TOTALMENTE SBAGLIATA:
Non era proprop la soluzione che desideravo, il chiamante dovrà gestire lock e unlock
NON E' IL CHIAMANTE a dover gestire lock/unlock
MA
IL CHIAMATO!
std::atomic, serve per eseguire operatzioni "atomiche" (somma sottrazione e poco altro) su un oggetto dalle dimensioni massime di 64 bit.
NON per gestire l ""accesso concorrente a risorsa"".
L'accesso concorrente a risorsa si gestiche con i mutex LATO RISORSA, NON lato chiamante.
Hai DUE possibilita':
- MUTEX: SOLO un thread alla volta accede alla risorsa, o meglio, a quel pezzetto di codice.
- READ/WRITE LOCK: in lettura ci possono accede quanti thread vogliono,
MA UN SOLO thread alla volta puo' accedere in scrittura. Quando vuole accedere:- aspetta che TUTTI i thread in lettura ancora in esecuzione abbiano terminato, e NON permette l'accesso a nessun nuovo thread
- accede in scrittura e fa quello che si deve fare
- al termine lascia liberi gli altri thread di procedere
.
Alla fin fine, dove sta' il "barbatrucco":
ti serve UN UNICO oggetto di sincronizzazione accessibile da TUTTI i thread per poter fare le sincronizzazioni.
SE ogni thread ne usa uno per proprio conto, non sincronizzi un'acciderbolina.
Ora, SE tu scrivi: "il chiamante dovrà gestire lock e unlock" e l'oggetto di sincronizzazione e' un bello STATICONE,
otteni esattamente lo stesso effetto, poiche' lo staticone non e' altro che la versione MAL SCRITTA
dell'oggetto di sincronizzazione gestito dalla risorsa condivisa.
La versione corretta e' APPICCICARE un oggetto di sincronizzazione DIRETTAMENTE alla risorsa a cui si vuol accedere
in modo sincronizzato.
--
Ora, COME si implementa il tutto, DIPENDE dalle scelte programmatore. ;-)
MA la parte "filosofica" (e' la RISORSA a gestire l'accesso, NON chi ci vuole accedere)
NON CAMBIA.
--
Ed a questo punto avrai capito che tutta la tua elucubrazione sullo stack ha un senso (ANCHE se l'elucubrazione e' un po' allucinatoria ;-))
Il problema NON E' lo stack, MA il fatto che usavi un oggetto di sincronizzazione DIVERSO per ogni thread!!
Al che, sincronizzavi ogni thread SOLO CON SE STESSO. Ma va! ;-)
--
PThreads non sono male. MA ormai le ultime versioni di C++ hanno la gestione dei thread integrata direttamente nella libreria standard.
Comunque guardati anche "boost" se non la conosci gia'.
--
Ci sei quasi!
Ti consiglio di approffondire MEGLIO come funzionano i thread e quali siano le problematiche nella programmazione concorrente.
SEMBRA facile, ma di casini incasinati se ne possono fare in quantita' industriale.
Tempo fa ho speso una SETTIMANA per risolvere una castronata fatta da un "consulente super esperto in programmazione concorrente".
Castronata da ragazzetto alle prime armi ! Altro che super esperto !