LINUX.ORG.RU

Нужен ли мьютекс для ro доступа к переменным типа bool, int?

Если ты можешь обеспечить однократность чтения области (memory barrier, volatile) - нет.

kirk_johnson ★☆
()
Ответ на: комментарий от FIL

Затем, что компилятор может преобразовать твой код таким образом, что область памяти ты будешь читать дважды. С разными результатами.

kirk_johnson ★☆
()

Если их может менять другой поток - да. И от типа тут ничего не зависит, если только это не atomic.

slovazap ★★★★★
()
Ответ на: комментарий от slovazap

volatile не обеспечивает атомарность.

#define __ACCESS_ONCE(x) ({ \
	 __maybe_unused typeof(x) __var = (__force typeof(x)) 0; \
	(volatile typeof(x) *)&(x); })
#define ACCESS_ONCE(x) (*__ACCESS_ONCE(x))


/**
 * atomic_read - read atomic variable
 * @v: pointer of type atomic_t
 *
 * Atomically reads the value of @v.
 */
static __always_inline int atomic_read(const atomic_t *v)
{
	return ACCESS_ONCE((v)->counter);
}

Это тебе из сырцов лялеха для x86 :)

kirk_johnson ★☆
()

Mutex и read-only переменные
Нужен ли мьютекс для ro доступа к переменным типа bool, int?

Это константы имеются в виду или какого рода read-only переменные? Это вопрос об атомарности операций чтения и о кэшировании или о чем?

asaw ★★★★★
()
Ответ на: комментарий от kirk_johnson

volatile везде даёт нужные результаты - не даёт оптимизатору удалить чтение из памяти. А атомарности, как я уже сказал, он не даёт нигде. Поэтому и разный.

slovazap ★★★★★
()
Ответ на: комментарий от slovazap

volatile везде даёт нужные результаты - не даёт оптимизатору удалить чтение из памяти. А атомарности, как я уже сказал, он не даёт нигде. Поэтому и разный.

В случае с x86 его достаточно для ACCESS_ONCE(), через который реализуются атомарные операции. Я слегка не понимаю, о чем мы тут спорим.

kirk_johnson ★☆
()
Ответ на: комментарий от kirk_johnson

Читать на что отвечаете следовало бы вам, ибо на замечание о неатомарности вы зачем-то постите платформенно-специфичный код.

slovazap ★★★★★
()
Ответ на: комментарий от slovazap

Читать на что отвечаете следовало бы вам, ибо на замечание о неатомарности вы зачем-то постите платформенно-специфичный код.

неатомарности

Я запостил платформенно-специфичный код атомарной операции чтения :)

kirk_johnson ★☆
()

барьеры с std::memory_model_consume/std::memory_model_release или как-то так

DELIRIUM ☆☆☆☆☆
()

Если никто их не модифицирует, то не нужен. Если модифицирует, то нужно синхронизировать доступ(атомики, как вариант).

anonymous
()
Ответ на: комментарий от slovazap

На всех, о которых стоит говорить.

anonymous
()
Ответ на: комментарий от Harald

за что тебе зарплату платят вообще :D

За работу же, ну )

UVV ★★★★★
() автор топика
Ответ на: комментарий от kirk_johnson

Затем, что компилятор может преобразовать твой код таким образом, что область памяти ты будешь читать дважды. С разными результатами.

Почему с разными, если там read-only?

anonymous
()
Ответ на: комментарий от mittorn

Зачем? read-only данные же. immutable считай

anonymous
()
Ответ на: комментарий от slovazap

Если их может менять другой поток - да.

А если мне не важно значение, которое я прочитаю. Т.е. другой поток может изменять переменную, а первый - только читать.

UVV ★★★★★
() автор топика
Ответ на: комментарий от UVV

Если оно используется как граничное значение для какого-то цикла - нужна блокировка либо сохрани в локальную переменную

frame ★★★
()
Ответ на: комментарий от frame

Если оно используется как граничное значение для какого-то цикла

Нет, не используется

UVV ★★★★★
() автор топика
Ответ на: комментарий от slovazap

за что тебе зарплату платят вообще :D

anonymous
()
Ответ на: комментарий от UVV

Значит сохрани в локалькую переменную либо читай в самый последний момент

frame ★★★
()
Ответ на: комментарий от UVV

Твой работодатель не видел ни одного твоего треда? Ему было бы полезно понять что за херня в его бизнесе.

anonymous
()
Ответ на: комментарий от anonymous

Можешь ему ссылку скинуть. Если тебе так хочется

UVV ★★★★★
() автор топика
Ответ на: комментарий от anonymous

Почему с разными, если там read-only?

Предполагается, что в эту переменную кто-то пишет. Иначе зачем её читать, если значение и так известно заранее?

kirk_johnson ★☆
()
Ответ на: комментарий от kirk_johnson

Иначе зачем её читать, если значение и так известно заранее?

Почему заранее? Кто-то может ее в рантайме задавать. А потом кто-то будет ее читать. Можно делать достаточно сложные и полезные immutable структуры данных.

anonymous
()
Ответ на: комментарий от kirk_johnson

Предполагается, что в эту переменную кто-то пишет. Иначе зачем её читать, если значение и так известно заранее?

А ты как argc/argv читаешь? Или считаешь, что их значение и так известно заранее?

anonymous
()
Ответ на: комментарий от anonymous

А ты как argc/argv читаешь? Или считаешь, что их значение и так известно заранее?

У тебя хобби такое - в каждом треде заново argc/argv читать? :D

kirk_johnson ★☆
()
Ответ на: комментарий от kirk_johnson

У тебя хобби такое - в каждом треде заново argc/argv читать? :D

А у тебя? Это же ты не знаешь, что данные можно сначала подготовить, а потом вычисления для них запустить.

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.