Condivisione di informazioni in ambiente multi-threading

Tradotto automaticamente da Deepl

4D v16 R6 introduce un nuovo concetto di comunicazione tra i processi: le variabili oggetto e collezione condivise! Si tratta di una soluzione che consente di evitare l’uso di variabili interprocesso (che non possono essere utilizzate in modalità multi-thread). Grazie a ciò, sarà possibile condividere facilmente le informazioni tra processi preemptive.

Esempio di database

Nuovo concetto: oggetti condivisi / collezioni

Nel mondo della programmazione informatica, quando si ha bisogno di prestazioni, meno si condividono i dati, più si è efficienti. Ma naturalmente, nella maggior parte dei casi i processi creati devono comunicare tra loro. Per inviare parametri, ottenere risultati o semplicemente per accedere a informazioni condivise. Questo è il motivo per cui sono stati creati gli oggetti condivisi e le raccolte condivise! (Ricordiamo che gli oggetti e le collezioni normali non possono essere condivisi tra i processi. Quando vengono passati come parametri, viene creata una copia degli oggetti).

Glioggetti condivisi e le raccolte condivise si comportano come quelli standard, ma devono essere dichiarati come “condivisi” durante la loro istanziazione con i seguenti nuovi comandi: Nuovo oggetto condiviso e Nuova collezione condivisa. Una volta istanziati, possono essere utilizzati direttamente, come tutti gli altri, per la lettura. Non è necessario alcun semaforo o altro, basta usare gli oggetti condivisi.

Per scrivere o modificare, gli oggetti condivisi devono essere circondati dalle parole chiave Use e End use. Queste parole chiave impostano i semafori interni e devono essere utilizzate per accedere al contenuto di oggetti e collezioni in modalità di scrittura. L’uso di queste parole chiave è davvero semplice, molto più semplice dei semafori del linguaggio 4D. Come mai? Non si può dimenticare di liberarle. Use e End use circondano sempre le variabili, quindi non si può dimenticare di rilasciare il blocco.

$object:=New shared object
$ps:=New process("my process";0; "myprocess";$object) // inviato come riferimento
Use ($object)
$object .myAttribute:=10
End use

Come usarli in altri processi?

Vi starete chiedendo: Come posso utilizzare un oggetto condiviso da un altro processo (in modo diverso dall’invio di un parametro)? Come posso condividere senza variabili interprocesso?

Un oggetto “supercondiviso” risolve questo problema. Un nuovo comando, Storage, consente di accedere a questo oggetto per tutti i processi in esecuzione.

Questo oggetto è unico su ogni macchina. Uno (in modalità utente singolo), altrimenti uno per client e uno sul server. Il comando Storage restituisce l’oggetto condiviso, che può essere manipolato come qualsiasi altro oggetto condiviso, ma può contenere solo oggetti condivisi o collezioni condivise. (Si noti che anche i componenti possono contenere Storage ).

Use (Storage)
Storage .myCollection:=New shared collection
End use

Vantaggi

Glioggetti condivisi e le raccolte condivise presentano molti vantaggi rispetto alle variabili interprocesso standard, quali:

  • nessuna necessità di protezione in lettura: accesso veloce
  • Le parole chiave Use e End Use evitano errori di codifica che possono portare a situazioni di deadlock.
  • poiché gli oggetti o le collezioni sono solitamente gerarchici (contengono altri oggetti o collezioni), bloccando un oggetto si blocca l’intera catena in una sola volta, migliorando le prestazioni.

Vi abituerete rapidamente agli oggetti e alle collezioni condivise e diventerà un modo naturale di programmare 🙂

Roland Lannuzel
- Product Owner ed esperto di 4D - Dopo aver studiato elettronica, Roland è passato all'IT industriale come sviluppatore e consulente, realizzando soluzioni per i clienti con una varietà di database e tecnologie. Alla fine degli anni '80 si è innamorato di 4D e lo ha utilizzato per scrivere applicazioni aziendali che includono sistemi di contabilità, fatturazione e posta elettronica. Entrato a far parte dell'azienda nel 1997, Roland ha dato il suo prezioso contributo progettando specifiche, strumenti di test e demo, oltre a formare e parlare alla comunità 4D in occasione di numerose conferenze. Continua a plasmare attivamente il futuro di 4D definendo nuove funzionalità e strumenti di sviluppo di database.