2014-12-09 13 views
6

in un multi-threaded (Linux/amd64 Pthread, C11) applicazione Ho un struct (momitem_st in monimelt.h) contenente in particolare due campiaccesso atomicly due campi scalari

uint16_t i_paylkind; 
void* i_payload; 

(se necessario, ho potuto cambiare il tipo di i_paylkind a qualche altro tipo integrale, ad esempio uintptr_t o atomic_uint)

FWIW, i_paylkind è un discriminante definente l'attuale struct runtime tipo il i_payload sta indicando.

È possibile accedere a questi due campi in modo atomico (ad esempio, altri thread che accedono allo stesso struct). Naturalmente ho anche un pthread_mutex_t i_mtx; nella stessa struttura che potrei bloccare (usando pthread_mutex_lock). Ma per motivi di prestazioni, vorrei evitarlo (forse transactional memory potrebbe essere rilevante)

Sembra che <stdtomic.h> non fornisca alcun macchinario per quello.

(domanda relativa ai miei MELT monitor GPLv3 + software)

+1

Credo che sia necessario il supporto hardware per operazioni di confronto e scambio, o introdurre un blocco di livello superiore (spinlock, mutex, fino a voi). –

+0

@ ParkYoung-Bae, no per niente. I tipi atomici sono definiti per tutti i tipi ma per gli array. –

+0

Per inciso: pthread_mutex_t è solitamente un typedef per un tipo integrale. Questo non dovrebbe imporre sanzioni di performance enormi per impostazione predefinita. –

risposta

4

Se avete davvero un compilatore C11, il qualificatore _Atomic si applica a qualsiasi tipo di dati. Basta usarlo. Per i tipi struct, le uniche cose che puoi fare è caricare e archiviare, sfortunatamente, non hai accesso ai singoli membri.

+0

E magari aggiungere un controllo pre-processore '#ifdef __STDC_NO_ATOMICS__ #error No atomiC# endif'? Non penso che il qualificatore _Atomic sia obbligatorio da implementare. – Lundin

+2

@Lundin, il testo della domanda è formulato partendo dal presupposto che 'stdatomic.h' esista. In C11, hai tutti gli atomici, incluso '_Atomic', o niente. –