Чтение данных критического раздела с помощью pthreads - PullRequest
1 голос
/ 21 сентября 2009

У меня многопоточное приложение, я использую pthreads с функцией pthread_mutex_lock. Единственные данные, которые мне нужно защитить, находятся в одной структуре данных. Безопасно ли применять блокировку только при записи в структуру данных? Или я должен применить блокировку всякий раз, когда я читаю или пишу?

Я нашел вопрос, похожий на этот, но это было для Windows, из этого вопроса можно было бы ответить на мой, что все в порядке. Просто хочу убедиться, хотя.

EDIT

follow: Итак, я хочу передать аргумент командной строки и при чтении из него (из разных потоков). Мне все еще нужно использовать pthread_mutex_lock?

Ответы [ 3 ]

4 голосов
/ 21 сентября 2009

Вы можете использовать pthreads_rwlock_t, чтобы разрешить параллелизм «один автор ИЛИ N-читателей». Но если вы придерживаетесь общего pthread_mutex_lock, его нужно получить для ЛЮБОГО доступа к общей структуре данных, которую он защищает, так что вы сокращаете все до параллелизма «один читатель или записывающий».

3 голосов
/ 21 сентября 2009

Необходимо также применять блокировку при чтении, если только вы не можете гарантировать атомарную запись (после чего вам даже не нужно блокировать запись). Проблема возникает из-за записи, которая занимает более 1 цикла.

Представьте, что вы записываете 8 байтов как две 4-байтовые записи. Если другой поток запускается после того, как он наполовину записан, чтение будет считывать недействительные данные. Весьма необычно, что это происходит, но когда это делает адскую ошибку, чтобы выследить.

1 голос
/ 21 сентября 2009

Да, вам нужно заблокировать как чтение, так и запись.

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

Если все, что вам нужно, - это одно целочисленное значение, вы можете использовать атомарные целые числа. GCC имеет атомарные атрибуты, которые вы можете использовать. Это не так переносимо, как использование замков pthreads.

...