#c #c 20 #c -coroutine
Вопрос:
Ссылка на C содержит следующую инструкцию на странице сопрограммы:
Обратите внимание , что, поскольку сопрограмма полностью приостановлена перед вводом
awaiter.await_suspend()
, эта функция может свободно передавать дескриптор сопрограммы между потоками без дополнительной синхронизации.
Приостановленная сопрограмма-это просто обычные данные, так что это имеет смысл. Однако даже при передаче простых данных между потоками вам требуется синхронизация. Так почему же он вам здесь не нужен?
Я неправильно истолковываю это утверждение? Есть ли здесь какой-то подразумеваемый барьер памяти?
Комментарии:
1. Обратите внимание, что «без дополнительной синхронизации» . Это не означает, что синхронизации нет.
2. @DanielLangr Это то, что они пытаются сказать? Если вы синхронизируете свое состояние, вам не нужно перепрыгивать через дополнительные обручи, чтобы перемещать сопрограммы по потокам?
3. Я не эксперт по сопрограммам, но я предполагаю, что они пытаются сказать, что вам не нужно заботиться о какой-либо явной синхронизации. Поэтому должно быть безопасно записывать данные (скажем, неатомного
int
типа) до приостановки и считывать их после возобновления в другом потоке. И какой-то внутренний механизм должен синхронизировать такое чтение и запись. Пожалуйста, поправьте меня кто-нибудь, если я ошибаюсь.4. Это происходит между потоками-раньше . Передача данных в
std::thread::thread
is синхронизируется-с запуском нового потока, и запуск нового потока выполняется последовательно-перед любыми операциями с ним5. Функция, которая передает дескриптор сопрограммы между потоками, должна делать это потокобезопасным способом. Если реализация решает удалить его из одного потока и передать другому, то должна быть какая-то очередь сообщений или другая синхронизация, определенная реализацией. И если реализация решает ничего не передавать между потоками, то в синхронизации нет необходимости. Текст говорит вам, что вам не нужно предохраняться от реализации, передающей вашу сопрограмму другому потоку, потому что только один поток за раз будет запускать сопрограмму.