В многопоточна програма, която беше написана, имам някои проблеми с производителността с много голямо състезание за заключване.
Реших този проблем, като имах няколко флага в рамките на 32-битово цяло число без знак.
в момента просто измествам малко стойностите във временна променлива и след това я записвам атомно.
Но наистина не обичам да си спомням точния брой битови смени или къде точно се намира флагът.
Така че се чудех дали мога просто да направя обединение с uint32_t и структурата с моите bitflags със същия размер, не мога ли да получа достъп до bitflags чрез структурата и атомно да я запиша като 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