многопоточность в вопросе c - PullRequest
1 голос
/ 12 июня 2010

Гарантирует ли мьютекс выполнение потока в порядке поступления?

, то есть, если поток 2 и поток 3 ожидают, пока поток 1 находится в критической секции

что именно происходит после выхода потока 1 из критической секции, если поток 2 достигает блокировки мьютекса перед потоком3, поток 2 будет разрешено войти в критическую секцию до потока 3?

или произойдет гонка?

если это не гарантировано, как я могу решить это?(может очередь?)

Ответы [ 4 ]

4 голосов
/ 12 июня 2010

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

4 голосов
/ 12 июня 2010

Такое поведение должно быть деталью реализации вашей библиотеки потоков (о которой вы не упоминали). Я предполагаю, что большинство многопоточных библиотек не дают такой гарантии. Если, конечно, у ожидающих потоков не было других приоритетов.

0 голосов
/ 16 июня 2010

Вопрос, который вы задали, является классическим случаем «ограниченного ожидания», и существует известный способ решения этой проблемы с помощью [Алгоритма пекарни].

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

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

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

0 голосов
/ 12 июня 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...