Является ли чтение/запись для 8-байтовой переменной без выравнивания по кэшу атомарной или нет на x86_64?Linux

Ответить Пред. темаСлед. тема
Anonymous
 Является ли чтение/запись для 8-байтовой переменной без выравнивания по кэшу атомарной или нет на x86_64?

Сообщение 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

Подробнее здесь: https://stackoverflow.com/questions/792 ... c-or-not-o
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «Linux»