2011-01-14 2 views
1

Рассмотрите программу с оптимальным количеством потоков, запущенную на выделенном сервере, поэтому, если один поток заблокирован, нет других (почти) ожидающих процессорного времени. делает ли блокировка спина более эффективными, чем мьютекс, во всех возможных случаях в таких обстоятельствах?mutex vs. spin lock when thread count = hardware parallelism

[EDIT] некоторые пояснения: поскольку нет конкуренции за процессорное время между потоками, нить может использовать блокировку вращения без какого-либо влияния на производительность других потоков. и блокировка спина не переключается в режим ожидания, который может быть достаточно тяжелым (по крайней мере, на окнах, idk, как он работает на linux)

+0

Можете ли вы объяснить, почему, по вашему мнению, спин-блокировка лучше, чем мьютекс в этом случае? – Artium

+0

уверен, попробует ... –

ответ

1

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

+0

О, давайте разделим это: 1) системные потоки будут иногда просыпаться, но это не ожидается часто и оказывает значительное влияние на программу, которая пытается использовать 100% всех ядер. 2) Не уверен, что я получил последнюю последнюю часть: вы имеете в виду, что отсрочка ожидания может еще хуже отразиться на разблокировке ресурсов другим потоком? можете ли вы рассказать всю идею? –

+0

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

0

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

+0

'mutexe's на самом деле не нужны, если вы не пытаетесь оптимизировать свой код, и это зависит от разных времен для ввода-вывода и т. Д. - вы имеете в виду описанную среду или вообще? –

+0

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

0

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

+0

На самом деле это не так надуманно: веб-сервер, почтовый сервер, медиа-потоковый сервер, игровой сервер и т. Д. –

+0

Ни один из них никогда не будет гарантирован в этой ситуации. Чтобы использовать встречный аргумент, в ситуации, когда есть другой поток, ожидающий этого CPU, мьютекс почти всегда будет более оптимальным (если время ожидания не очень велико). Блокировка спина будет потреблять процессор и имеет тенденцию отклонять фоновый поток. Эта ситуация намного, гораздо более вероятная, чем та, которую вы описали в OP. –