Довольно простой вопрос, но я не вижу, чтобы он задавался где-либо.
Допустим, у нас есть глобальная структура (в C), например:
struct foo {
int written_frequently1;
int read_only;
int written_frequently2;
};
Мне кажется, что если у нас много потоков для чтения и записи, нам нужен семафор (или другая блокировка) для элементов written_frequently
, даже для чтения, поскольку мы не можем быть на 100% уверены, что назначения к этой структуре будет атомарным.
Если мы хотим, чтобы множество потоков читало элемент read_only
, а ни один не записывал, нам нужен семафор для доступа к структуре только для чтения?
(Я склонен сказать нет, потому что тот факт, что местоположения непосредственно до и после постоянно меняются, не должен влиять на элемент read_only
, а чтение нескольких потоков не должно мешать друг другу. Но Я не уверен.)
[Редактировать: теперь я понимаю, что должен был задать этот вопрос намного лучше, чтобы уточнить очень конкретно , что я имел в виду. Естественно, я действительно не обращал внимания на все связанные с этим проблемы, когда впервые задавал вопрос. Конечно, если я сейчас полностью отредактирую вопрос, я испорчу все эти замечательные ответы. То, что я имел в виду, больше похоже на:
struct bar {
char written_frequently1[LONGISH_LEN];
char read_only[LONGISH_LEN];
char written_frequently2[LONGISH_LEN];
};
Основная проблема, о которой я спрашивал, заключается в том, что, поскольку эти данные являются частью структуры, на них вообще влияют другие члены структуры, и может ли это повлиять на них взамен?
Тот факт, что члены были целыми числами, и поэтому записи, вероятно, являются атомарными, в данном случае на самом деле является просто красной сельдью.]