Как реализовать условие потока с kthread? - PullRequest
0 голосов
/ 04 июля 2019

Я знаю, что мы можем использовать pthread_cond_init, pthread_cond_wait и pthread_cond_broadcast для реализации сигнализации состояния потока в пространстве пользователя.Но как мы можем реализовать это в модуле ядра, который использует kthread?

linux / mutex.h обеспечивает блокировку, как обсуждалось в этом вопросе .Но это, похоже, не связано ни с какими переменными условия.

linex / wait.h похоже, что ожидание условия, но у него нет документации, поэтому вокруг него слишком много проблем.Например, wake_up_interruptable может иметь состояние гонки при использовании, как предложено в примерах без мьютекса .Кажется маловероятным, что очереди ожидания могли бы быть объединены с ожиданиями мьютекса таким образом, чтобы реализовать семантику, подобную pthread_cond_wait, потому что функции планирования потоков, реализующие эти различные API, должны быть интегрированы для обеспечения атомарной семантики.

Какможет ли модуль ядра получить атомарную семантику сна и разблокировки, как в обычном API пользовательского пространства, например pthread_cond_wait?

Мне нужна конкретная семантика (из справочной страницы pthread_cond_wait* *)1026 *):

Эти функции атомарно освобождают mutex и заставляют вызывающий поток блокировать переменную условия cond ;«атомно» здесь означает «атомарно по отношению к доступу другого потока к мьютексу, а затем к условной переменной».То есть, если другой поток может получить мьютекс после того, как поток о блоке освободил его, то последующий вызов pthread_cond_broadcast () или pthread_cond_signal () в этомпоток должен вести себя так, как если бы он был выпущен после того, как поток для блокировки блока заблокирован.

Важными требованиями являются:

  • Условие является общей структурой, иДоступ к нему возможен только при удержании мьютекса.
  • Атомность не позволяет условию стать истинным между освобождением мьютекса и блокировкой потока.Без этого поток может проверить условие (когда оно ложно), затем освободить мьютекс, затем условие становится истинным (и сигнал генерируется и распространяется), а затем поток засыпает и пропускает сигнал.

( Здесь - это то, как pthread_cond_wait используется в программе).

...