Я читал книгу о многопоточности в c ++, и я действительно запутался в том, что на самом деле означает термин межпоточный. Сначала я подумал, что это было использовано для описания связи между потоками. Но затем, когда книга продвигается все дальше и дальше, она начинает использовать этот термин более свободно до такой степени, что я больше не понимаю, что это значит. Например, возьмите этот короткий абзац
«Межпотоковый случай-до» также объединяется с отношением «секвенированный-до»: если операция А секвенируется до операции В, а межпотоковая операция В происходит — до операции С, тогда межпотоковая операция-предшествует С. A синхронизируется с B и B секвенируется до C, затем происходит межпотоковый поток до C. Эти два вместе означают, что если вы вносите серию изменений в данные в одном потоке, вам нужна только одна связь для синхронизации с данные, которые будут видны последующим операциям в потоке, который выполнил C. «null
После прочтения этого пункта я был официально потерян. И книга, которая очень хорошо объясняла новые термины, совершенно забыла об этом. Это заставляет меня думать, что это был такой часто используемый термин, который не нужно было объяснять, что усложняло задание этого вопроса. Так может ли кто-то найти время, чтобы объяснить, что на самом деле означает этот термин?
Семестр межпоточной в этом контексте не связан с конкретным каналом или методологией связи между потоками, а скорее с концепцией случается, перед тем.
Давайте возьмем для примера отрывок, который вы цитировали:
если операция A секвенируется перед операцией B, а операция B между потоками происходит до операции C, тогда A между потоками происходит до C
в следующем коде
thread1
--------------
0x10: int a = 1;
0x11: sendResultToThread(a);thread2
--------------
0x12: int c = getResultFromOtherThread();
Упрощение без гонок данных и допущение атомарности для задействованных здесь инструкций означает, что если операция 0x10 секвенируется до 0x11 (и в том же потоке, так как она предшествует в исходном коде) и операции 0x11 случается, перед тем в многопоточном контексте (то есть существует какой-то механизм, для которого эффекты памяти, сделанные 0x11, видны для 0x12 до выполнения 0x12, а также, среди прочего, гарантирует, что 0x11 всегда будет выполняться во времени до 0x12, когда несколько потоков взаимодействовать), то 0x10 между потоками происходит до C.
Аналогичные выводы можно сделать для второго предложения.
Итак, чтобы ответить на ваш вопрос: межпотоковая операция (не путать с внутри-нить то есть в том же потоке) относится к взаимодействию и синхронизации (явной или неявной) между потоками. Не думайте об этом с точки зрения общих областей памяти и т. П., Так как это может помешать вам рассуждать об объясненных концепциях.
«Общение», возможно, не лучший способ думать об этом … «Взаимодействие» лучше. Если поток A записывает в дескриптор файла, а затем поток B закрывает этот дескриптор файла, они общались? Не совсем, но если нить B закрывает ручку до А пишет в него, то запись не удастся из-за взаимодействие между ними.
Так что не думайте об этом как о передаче данных. Нити часто нужно координировать друг с другом, независимо от того, общаются они или нет, и самый важный аспект координации — это делать вещи в порядке, который имеет смысл. Поскольку потоки работают асинхронно и в (практически) недетерминированном порядке, это не тривиальная вещь. Отсюда акцент на этих простых, но составных примитивах упорядоченных вычислений в принципиально неупорядоченной среде.