2014-12-09 8 views
6

В многопоточной (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 + программное обеспечение)

+1

Я считаю, что вам нужна аппаратная поддержка для операций с двойным сравнением и заменой, или ввести блокировку более высокого уровня (спин-блокировка, мьютексы, до вас). –

+0

@ ParkYoung-Bae, нет совсем нет. Атомные типы определены для всех типов, но для массивов. –

+0

В стороне: pthread_mutex_t обычно типизирован для интегрального типа. Это не должно налагать огромные штрафные санкции по умолчанию. –

ответ

4

Если у вас есть на самом деле C11 компилятор, то _Atomic классификатор относится к любому типу данных. Просто используйте его. Для типов struct единственное, что вы можете сделать, это загрузить и сохранить, к сожалению, у вас нет доступа к отдельным членам.

+0

И, возможно, добавить проверку перед процессором '#ifdef __STDC_NO_ATOMICS__ #error Нет атома # endif'? Я не думаю, что спецификатор _Atomic является обязательным для реализации. – Lundin

+2

@ Lundin, текст вопроса формулируется в предположении, что существует 'stdatomic.h'. В C11 либо у вас есть все атомы, в том числе '_Atomic', либо ничего. –

 Смежные вопросы

  • Нет связанных вопросов^_^