Сопрограммы, взаимодействующие с потоками

#c #c 20 #c -coroutine

Вопрос:

Ссылка на C содержит следующую инструкцию на странице сопрограммы:

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

Приостановленная сопрограмма-это просто обычные данные, так что это имеет смысл. Однако даже при передаче простых данных между потоками вам требуется синхронизация. Так почему же он вам здесь не нужен?

Я неправильно истолковываю это утверждение? Есть ли здесь какой-то подразумеваемый барьер памяти?

Комментарии:

1. Обратите внимание, что «без дополнительной синхронизации» . Это не означает, что синхронизации нет.

2. @DanielLangr Это то, что они пытаются сказать? Если вы синхронизируете свое состояние, вам не нужно перепрыгивать через дополнительные обручи, чтобы перемещать сопрограммы по потокам?

3. Я не эксперт по сопрограммам, но я предполагаю, что они пытаются сказать, что вам не нужно заботиться о какой-либо явной синхронизации. Поэтому должно быть безопасно записывать данные (скажем, неатомного int типа) до приостановки и считывать их после возобновления в другом потоке. И какой-то внутренний механизм должен синхронизировать такое чтение и запись. Пожалуйста, поправьте меня кто-нибудь, если я ошибаюсь.

4. Это происходит между потоками-раньше . Передача данных в std::thread::thread is синхронизируется-с запуском нового потока, и запуск нового потока выполняется последовательно-перед любыми операциями с ним

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