2013-10-11 2 views
3

Оптимизация компилятора может изменить порядок доступа к памяти, а процессор может выполнять инструкции не по порядку.Оператор и выход из командной строки

Вопрос: будет ли разделение операторов с запятой гарантией точного порядка выполнения? Или единственный способ - использовать барьеры памяти (которые сложны и нестандартны)?

Если это не так, то что именно гарантируется при заказе выполнения разделенных запятыми операторов?

+3

Ничего. Оператор запятой ничем не отличается от двух операторов, разделенных ';' в этом отношении. Помните, что исполнение вне порядка выполняется только тогда, когда компилятор/процессор может доказать, что результат будет таким же, как и в порядке. – Adam

+0

Почему вы спрашиваете? Чего вы хотите достичь? – nosid

+0

@Adam, который может быть ответом. – Leushenko

ответ

2

Оператор запятой ничем не отличается от двух утверждений, разделенных символом; в этом отношении

Язык указывает семантику оператора, но компилятор/ЦП могут выбирать, как они хотят его реализовать. Если они могут делать что-то не по порядку, они свободны, если они могут доказать, что результат будет таким же, как и в порядке. И они это делают, часто.

Если по какой-либо причине вы хотите получить гарантии по фактическому заказу, вам необходимо будет проверить свою документацию по компилятору и ЦП, чтобы обеспечить ее соблюдение. Это может означать отключение оптимизации, используя дополнительные ключевые слова, такие как volatile, использование забора памяти и т. Д. Однако, если вам абсолютно не нужен порядок, позвольте компилятору и ЦП выполнять свою задачу и дать вам дополнительную производительность без каких-либо дополнительных затрат для вас.

+1

http://stackoverflow.com/questions/2484980/why-is-volatile-not-considered-useful-in-multithreaded-c-or-c-programming – nosid

+0

@nosid OP не упоминал нить один раз. Это для взаимодействия с оборудованием. – Adam

+0

@nosid это тоже очень интересно, спасибо! – Amomum

3

Нет, это не так. Порядок выполнения (как измеряется другими потоками) гарантируется инструментами, которые предназначены для обеспечения порядка исполнения. Оператор запятой предназначен для отбрасывания значения первого выражения и имеет ограниченное использование.

Правило «как будто» здесь король, и в отсутствие барьеров оно истолковано в однопоточном контексте.

5

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

Смежные вопросы