Я не понимаю, когда использовать атомный_t в C.
Некоторые люди говорят, что нет необходимости использовать атомный_t для защиты простых операций чтения и записи над переменной размером менее 8 байт на x86_64. (например, long или int).
Другие говорят, что только переменные, выровненные по кешу, могут гарантировать атомарность.
Чтобы внести ясность, я написал простую программу чтобы проверить это. В программе я запускаю 128 потоков для работы с глобальной длинной переменной, не выровненной по кэшу. Потоки с четными номерами устанавливают переменную в 1, а потоки с нечетными номерами устанавливают ее в -1. После этого они утверждают, что переменная равна -1 или 1.
Когда я запускаю эту программу несколько раз, утверждение иногда терпит неудачу.
код ниже:
#include
#include
#include
#include
#include
#include
#define NUM_THREADS 128
struct foo{
char pad[54];
long val;
char pad2[54];
};
struct foo global __attribute__((aligned(64)));
void* thread_func(void* arg) {
int thread_id = *((int*)arg);
for (int j=0;j
Подробнее здесь: https://stackoverflow.com/questions/792 ... c-or-not-o
Является ли чтение/запись для 8-байтовой переменной без выравнивания по кэшу атомарной или нет на x86_64? ⇐ Linux
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение
-
-
Почему мой код NASM печатает большое значение при печати байтовой переменной db как int?
Anonymous » » в форуме Linux - 0 Ответы
- 13 Просмотры
-
Последнее сообщение Anonymous
-
-
-
Bootstrap v4.1.0 Nav Bar. Проблема выравнивания выравнивания [Duplicate]
Anonymous » » в форуме Javascript - 0 Ответы
- 23 Просмотры
-
Последнее сообщение Anonymous
-