В многопоточной программе, которая была написана, у меня есть некоторые проблемы с производительностью из-за очень высокой конкуренции за блокировку.
Я решил эту проблему, добавив несколько флагов в 32-битное целое число без знака.
в настоящее время я просто немного сдвигаю значения во временной переменной, а затем атомарно записываю ее.
Но мне не очень нравится запоминать точное количество битовых сдвигов или где именно находится какой-либо флаг.
Итак, мне было интересно, могу ли я просто объединить uint32_t и структуру с моими битовыми флагами с одинаковым размером, не могу ли я получить доступ к битовым флагам с помощью структуры и атомарно записать их как uint32_t?
ниже приведен код того, как я хочу, чтобы он работал. Это работает, но я не уверен, разрешено ли это
#include <stdio.h>
#include <stdlib.h>
#include <inttypes.h>
typedef struct atomic_flags {
unsigned int flags1 : 2;
unsigned int flags2 : 2;
unsigned int flags3 : 2;
unsigned int flags4 : 2;
unsigned int flags5 : 8;
unsigned int reserved : 16;
}atomic_flags;
union data {
atomic_flags i;
uint32_t q;
} data;
int main() {
union data test1;
union data test2;
test1.i.flags1 = 1;
test1.i.flags2 = 2;
test1.i.flags3 = 3;
test1.i.flags4 = 2;
test1.i.flags5 = 241;
test1.i.reserved = 1337;
printf("%u\n", test1.q);
__atomic_store_n(&test2.q, test1.q, __ATOMIC_SEQ_CST);
printf("test1 flags1: %u\n", test1.i.flags1);
printf("test1 flags2: %u\n", test1.i.flags2);
printf("test1 flags3: %u\n", test1.i.flags3);
printf("test1 flags4: %u\n", test1.i.flags4);
printf("test1 flags5: %u\n", test1.i.flags5);
printf("test1 reserved: %u\n", test1.i.reserved);
printf("test2 flags1: %u\n", test2.i.flags1);
printf("test2 flags2: %u\n", test2.i.flags2);
printf("test2 flags3: %u\n", test2.i.flags3);
printf("test2 flags4: %u\n", test2.i.flags4);
printf("test2 flags5: %u\n", test2.i.flags5);
printf("test2 reserved: %u\n", test2.i.reserved);
}
а может это вообще возможно?
__atomic_store_n(&test2.i.flags1, 2, __ATOMIC_SEQ_CST);
__atomic_store_n()
- это встроенный компилятор. Не могли бы вы сказать мне, где вы берете эту информацию? - person rowan.G   schedule 09.10.2014