Мьютексы в многопоточном приложении Linux - PullRequest
0 голосов
/ 27 июня 2011

Не могли бы вы помочь мне понять, как использовать мьютексы в многопоточном приложении Linux, где:

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

Таким образом, можно читать одновременно, но операция записи - это одна операция в одно и то же время.Во время записи все остальные операции должны ждать до завершения.

Ответы [ 3 ]

3 голосов
/ 27 июня 2011

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

Вы спрашиваете о блокировке чтения-записи. Блокировки чтения-записи используют мьютексы под капотом. Функции POSIX, которые имеют дело с блокировками чтения-записи, начинаются с pthread_rwlock_. Поскольку вы работаете на компьютере с Linux, просто наберите man pthread и найдите раздел, помеченный как «READ / WRITE LOCK ROUTINES».

1 голос
/ 27 июня 2011

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

Boost.Thread имеет один из них ( boost :: shared_mutex ), если у вас нет другой предпочтительной библиотеки потоков.При этом используются примитивы PThreads под оболочками, и, вероятно, вы сэкономите время на самостоятельной упаковке необработанных API.

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

Простой boost :: mutex также может быть использован здеськак отмечает @Als, но не разрешает многократное одновременное чтение.Это проще реализовать и может быть достаточно для ваших нужд, в зависимости от вашего профиля доступа для чтения / записи.

0 голосов
/ 27 июня 2011

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

...