Domanda

Obiettivo

Sto scrivendo una piccola biblioteca per la quale la portabilità è la principale preoccupazione. È stato progettato per assumere solo un ambiente C90 (ISO / IEC 9899: 1990) per lo più conforme ... niente di più. L'insieme di funzioni fornite dalla libreria funzionano tutte (lettura / scrittura) su una struttura di dati interna. Ho preso in considerazione alcune alternative di design, ma nient'altro sembra fattibile per ciò che la libreria è cercando di ottenere .

Domanda

Esistono algoritmi, tecniche o incantesimi portatili che possono essere utilizzati per garantire la sicurezza dei thread? Non mi preoccupo di far rientrare le funzioni. Inoltre, non mi preoccupo della velocità o (possibilmente) dello spreco di risorse se l'algoritmo / la tecnica / l'incantesimo è portatile. Idealmente, non voglio dipendere da alcuna libreria (come GNU Pth) o da operazioni specifiche del sistema (come test e set atomici).

Ho preso in considerazione la modifica di Algoritmo di panetteria di Lamport , ma non so come modificalo per lavorare all'interno delle funzioni chiamate dai thread invece di lavorare nei thread stessi.

Qualsiasi aiuto è molto apprezzato.

È stato utile?

Soluzione

Probabilmente l'algoritmo di panetteria di Lamport funzionerebbe; sfortunatamente, ci sono ancora problemi pratici con esso. In particolare, molte CPU implementano operazioni di memoria fuori servizio : anche se tu hai compilato il tuo codice in una sequenza di istruzioni perfettamente corretta, la CPU, quando esegui il tuo codice, può decidere di riordinare le istruzioni al volo per ottenere prestazioni migliori. L'unico modo per aggirare questo problema è utilizzare barriere di memoria , che sono altamente di sistema e CPU SPECIFICI.

Qui hai solo due scelte: (1) mantenere la tua libreria non sicura e rendere i tuoi utenti consapevoli di ciò nella documentazione, oppure (2) usare un mutex specifico per la piattaforma. L'opzione 2 può essere semplificata utilizzando un'altra libreria che implementa i mutex per una grande varietà di piattaforme e offre un'interfaccia unificata e astratta.

Altri suggerimenti

Senza supporto OS / hardware, almeno un CAS atomico, non c'è niente che tu possa fare che sia pratico. Ci sono ci sono librerie portatili che astraggono varie piattaforme in un'interfaccia comune, tuttavia.

http://www.gnu.org/software/pth/related.html

Quasi tutti i sistemi (anche Windows) possono eseguire libpthread in questi giorni.

Le funzioni non possono essere thread-safe o sono intrinsecamente thread-safe, a seconda di come si desidera guardarlo. E il threading / lock è innato per la piattaforma. In realtà, spetta a utenti della tua libreria gestire i problemi di threading.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top