Я не понимаю, когда использовать атомный_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
1732262621
Anonymous
Я не понимаю, когда использовать атомный_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
Подробнее здесь: [url]https://stackoverflow.com/questions/79214088/whether-read-write-for-an-cacheline-unaligned-8-byte-variable-is-atomic-or-not-o[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия