Visualizzazione dei risultati da 1 a 8 su 8
  1. #1
    Utente di HTML.it
    Registrato dal
    Dec 2008
    Messaggi
    152

    [C++] Libreria statica con contatore

    Sto cercando di implementare all'interno di una libreria che mette a disposizione una serie di funzioni un contatore statico che viene incrementato volta che viene richiamata una funzione. Per fare ciò ho creato una variabile static e la incremento ogni volta che avviene una chiamata. Pur compilando la libreria con target shared ottengo un comportamento strano del seguente tipo:

    Dati n processi che la usano {a,b,c, ..}, e la libreria n e considerando i come contatore ottengo il seguente comportamento:

    a chiama n ( i=1)
    a chiama n ( i=2)
    b chiama n ( i=1)
    c chiama n ( i=1)
    a chiama n ( i=3)

    mentre mi sarei aspettato il seguente comportamento:


    a chiama n (i = 1)
    a chiama n (i = 2)
    b chiama n (i = 3)
    c chiama n (i = 4)
    a chiama n (i = 5) ..

    Sapete dove sto sbagliando ?

  2. #2
    I dati di una libreria - anche se dinamica - sono privati di ogni processo. All'atto pratico è come se ogni processo avesse la sua libreria privata (ma con l'ottimizzazione che il codice della libreria in realtà è condiviso - in sola lettura - tra i vari processi).

    Ci sono dei sistemi platform-specific per fare sì che una variabile sia messa in una sezione della libreria sharata globalmente in lettura/scrittura, ma (1) devi specificare su che piattaforma e con che compilatore lavori e (2) occhio che comunque subentrano problemi di sincronizzazione (per variabili intere devi usare operazioni atomiche, per dati più complicati devi usare mutex cross-processo).
    Ultima modifica di MItaly; 07-06-2018 a 21:41
    Amaro C++, il gusto pieno dell'undefined behavior.

  3. #3
    Utente di HTML.it
    Registrato dal
    Dec 2008
    Messaggi
    152
    Ciao potresti farmi o linkarmi un esempio molto semplice per capire come dovrei creare una zona sherata ?
    1) sono sotto linux come os
    2) sto usando il classico g++ come compilatore

    nessun problema per proteggerla con le mutex e contorolli, il problema è che non so come condividerla

  4. #4
    Da quanto ne so Linux non supporta segmenti shareati definiti direttamente a livello di eseguibile. Se vuoi della memoria condivisa tra più processi in questo caso devi usare esplicitamente shm_open/mmap per creare/mappare della shared memory.
    Amaro C++, il gusto pieno dell'undefined behavior.

  5. #5
    Utente di HTML.it
    Registrato dal
    Dec 2008
    Messaggi
    152
    ma perdonami la differenza tra libreria statica e dinamica a questo punto in cosa consiste ? Perché ero convinto, e sicuramente mi sbaglio che nel caso di una libreria dinamica il codice fosse comune agli applicativi che la utilizzavano, cioè occupava un unica locazione di memoria, e per questo motivo pensavo fosse possibile condividere\tenere un'informazione comune a tutti gli applicativi come se fosse un server.

    Cercando in rete ho trovato che sotto windows è possibile definire all'interno di una dll una variabile condivisa in questo modo:

    #pragma data_seg(".shared")
    int varx=0;
    #pragma data_seg()

    però se ho capito bene la macro in questione funzionerebbe solo sotto Windows e no sotto linux, puoi confermarmelo ?

  6. #6
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,462
    E infatti il codice delle librerie dinamiche è comune, non è stato detto il contrario.

    Sono i dati utilizzati che sono privati.

    E non potrebbe essere diversamente altrimenti tutti i processi utilizzerebbero le stesse variabili all'interno delle librerie e sarebbe un gran casino.
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  7. #7
    Quote Originariamente inviata da oregon Visualizza il messaggio
    E non potrebbe essere diversamente altrimenti tutti i processi utilizzerebbero le stesse variabili all'interno delle librerie e sarebbe un gran casino.
    Non avrei saputo dirlo meglio.
    Amaro C++, il gusto pieno dell'undefined behavior.

  8. #8
    Utente di HTML.it
    Registrato dal
    Dec 2008
    Messaggi
    152
    E infatti il codice delle librerie dinamiche è comune, non è stato detto il contrario.

    Sono i dati utilizzati che sono privati.
    Essendo per me una cosa nuova preferivo una conferma .. grazie comunque!!

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.