2010-09-16 2 views
1
+0

Вы имеете в виду, что много заблокированных потоков на мьютексе ухудшают производительность? – Cipi

+0

@Cipi нет, я имею в виду наличие многих мьютексов независимо от статуса – Anycorn

ответ

1

Несколько ответов:

  1. Вы задаете неправильный вопрос. Если вам нужно более 1000 или около мьютексов, вы, скорее всего, что-то сделаете .
  2. Столько, сколько вам нужно. Метутекс, не связанный с процессом, не обычно использует любые ресурсы, кроме Оперативная память.
  3. Наличие множества неиспользуемых мьютексов ухудшает производительность точно так же, как и множество целых чисел; то есть вовсе не (при условии достаточной ОЗУ).
+4

Я не согласен. Я бы сказал это наоборот: если вам нужен только один мьютекс, вы, вероятно, делаете что-то не так, как код блокировки, а не данные. Было бы очень разумно делать объектно-ориентированное программирование для * каждого объекта * для хранения одного или нескольких мьютексов. –

+0

В Linux обычный мьютекс стоит ровно 24 байта. Это не слишком обременительно для многих случаев использования. – bdonlan

+0

@bdonlan Вы неверны. В Linux/i386 с glibc мьютекс действительно стоит 24 байта. В Linux/x86_64 с glibc он стоит 40. Легко представить, что он стоит от 40 до 24 байтов в Linux для другого процессора или при использовании чего-то другого, кроме glibc. Кроме того, инициализация мьютекса * может быть довольно дорого (особенно если у вас есть 10 000 из них). Кроме того, ОП никогда не говорил, что использует Linux для начала. –

3

POSIX позволяет реализовать мьютексы как ресурс на системном уровне, но такая реализация будет считаться крайне низким качеством, и я не могу представить, чтобы кто-нибудь ее использовал. В действительности, при современных реализациях (думаю, Linux) количество мьютексов, которые вы можете использовать, ограничено только виртуальным адресным пространством. (На самом деле у вас может быть даже больше, до общего размера физической памяти/свопа плюс размер файловой системы, если вы используете mmap и munmap для их отображения и при необходимости.)

Что касается производительности, то на 32-битной glibc, разблокировка надежных мьютексов - это операция O(n), где n - это число надежных мьютексов, заблокированных в настоящее время. Это связано с использованием односвязного списка, в котором требуется двусвязная; они закончили пространство в своей структуре pthread_mutex_t, чтобы соответствовать обеими указателями. Эта проблема применима только к прочным мьютексам, которые редко используются на практике и только для 32-разрядных Linux/glibc. Для всех других типов мьютексов количество мьютексов имеет без воздействия на производительность. Тем не менее, количество мьютексов в настоящее время влияет на производительность, но это сложный вопрос, выходящий за рамки простого ответа.

Смежные вопросы