В многопоточной (Linux/amd64, Pthreads, C11) приложения У меня есть struct
(momitem_st
в monimelt.h), содержащий в частности, двумя полямиобращающиеся atomicly два скалярных поля
uint16_t i_paylkind;
void* i_payload;
(в случае необходимости, я мог бы изменить тип i_paylkind
в какой-то другой интегрального типа, например, uintptr_t
или atomic_uint
)
FWIW, i_paylkind
дискриминант определения фактического выполнения struct
-типа i_payload
указывает на.
Возможно ли получить доступ к этим двум полям атомарно (w.r.t. другие потоки, обращающиеся к тому же struct
). Конечно, у меня также есть pthread_mutex_t i_mtx;
в той же структуре, которую я мог бы заблокировать (используя pthread_mutex_lock
). Но по соображениям производительности я мог бы избежать этого (возможно, transactional memory может быть уместным)
Похоже, <stdtomic.h>
не предоставляет никаких механизмов для этого.
(вопрос, связанный с моим MELT monitor GPLv3 + программное обеспечение)
Я считаю, что вам нужна аппаратная поддержка для операций с двойным сравнением и заменой, или ввести блокировку более высокого уровня (спин-блокировка, мьютексы, до вас). –
@ ParkYoung-Bae, нет совсем нет. Атомные типы определены для всех типов, но для массивов. –
В стороне: pthread_mutex_t обычно типизирован для интегрального типа. Это не должно налагать огромные штрафные санкции по умолчанию. –