Я знаю, что мы можем использовать 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
используется в программе).