Гарантирует ли мьютекс видимость (GLib)? - PullRequest
2 голосов
/ 18 января 2012

Я использую мьютексные утилиты Глиба для обработки параллелизма.Гарантируется ли, что обновленная версия измененной переменной будет видна любому другому потоку после разблокировки мьютекса?Должны ли эти потоки получить блокировку на мьютексе, чтобы безопасно его прочитать?

GStaticMutex mutex;
int value;

void init() {
  g_static_mutex_init(&mutex);
  value = 0;
}

void changeValue() {
  g_static_mutex_lock(&mutex);
  value = generateRandomNumber();
  g_static_mutex_unlock(&mutex);
}

Ответы [ 3 ]

1 голос
/ 18 января 2012

Вы должны работать по книге и позволить умным людям, которые внедрили мьютекс, беспокоиться о видимости и барьерах. В книге говорится, что мьютекс должен проводиться как при чтении, так и при записи.

Процессор может переставлять чтения и делает это много. Это помогает снизить потери при кешировании, поскольку вы начинаете извлекать данные за некоторое время до того, как они действительно понадобятся.
Поэтому, если вы читаете переменную после того, как другой процессор записал ее и снял блокировку, чтение может фактически быть выполнено до того, как это произойдет.
Мьютекс служит барьером памяти, предотвращая эту проблему (и другие).

0 голосов
/ 18 января 2012

Я думаю, что нашел ответ. Gthread - это оболочка для pthread (согласно http://redmine.lighttpd.net/boards/3/topics/425), а pthreads, кажется, реализует барьер памяти (/2437633/garantiruet-li-zaschita-peremennoi-s-pomoschy-myteksa-pthread-chto-ona-takzhe-ne-keshiruetsya) Но я не уверен, нужно ли использовать мьютекс для чтения значения.

0 голосов
/ 18 января 2012

Объект mutex должен читаться только через функции g_static_mutex_*.Если вы хотите узнать, можете ли вы получить мьютекс, вы можете использовать эту функцию:

g_static_mutex_trylock 

При связывании идентификатора он следует тем же правилам, что и с любым другим идентификатором C: это зависит от того, в какой области видимостион объявляется, и если указан некоторый спецификатор класса хранения (например, static или extern).

...