2014-12-09 19 views
6

(Linux/amd64, PThreads, C11) uygulaması Ben özellikle iki alan erişen atomik olarak iki sayısal alanlar çok kanallı olarak

uint16_t i_paylkind; 
void* i_payload; 

içeren struct ( monimelt.h içinde momitem_st) var (ben değiştirebilir diğer bazı ayrılmaz türüne i_paylkind tipi, örn uintptr_t veya atomic_uint)

FWIW, i_paylkindi_payload işaret ediyor gerçek struct çalışma zamanı tipi tanımlayan bir ayırt edici olduğunu.

Bu iki alana atomik olarak erişilebiliyor mu (aynı struct numarasına erişen diğer konular). Elbette kilitleyebildiğim (pthread_mutex_lock kullanarak) aynı yapıda bir pthread_mutex_t i_mtx; var. Ancak performans nedenlerinden dolayı bunu önlemek isteyebilirim (belki de transactional memory ilgili olabilir)

<stdtomic.h>, bunun için herhangi bir makine sağlamaz gibi görünüyor. Eğer gerçekten bir C11 derleyicisi varsa

+1

İki karşılaştırma ve değiştirme işlemi için donanım desteğine ihtiyacınız olduğunu ya da daha yüksek düzeyli bir kilit (size bağlı spinlock, mutex) getirmeniz gerektiğine inanıyorum. –

+0

@ ParkYoung-Bae, hayır hiç de değil. Atomik tipler tüm tipler için, ancak diziler için tanımlanmıştır. –

+0

Bir kenara göre: pthread_mutex_t genellikle bir tümleşik tip için bir yazım hatasıdır. Bu, varsayılan olarak büyük performans cezaları vermemelidir. –

cevap

4

(benim MELT monitor GPLv3 + yazılımı ile ilgili soru), _Atomic eleme herhangi bir veri türü için de geçerlidir. Sadece kullan. struct türleri için yapabileceğiniz tek şey yükleme ve depolamadır, maalesef bireysel üyelere erişiminiz yoktur.

+0

Ve belki bir ön işlemci denetimi ekleyin. #ifdef __STDC_NO_ATOMICS__ #error No atomiC# endif'? _Atomic niteleyicinin uygulanması zorunlu olduğunu düşünmüyorum. – Lundin

+2

@Lundin, soru metni stdatomic.h'nin var olduğu varsayımı altında formüle edilmiştir. C11'de ya _Atomic' dahil olmak üzere tüm atomlara sahipsiniz ya da hiçbir şey yok. –

İlgili konular