Как мне сообщить GCC, что переменная будет изменена несколькими потоками? - PullRequest
1 голос
/ 15 сентября 2011

Как мне сообщить GCC, что переменная будет изменена несколькими потоками?У меня проблемы с оптимизацией компилятора.

Ответы [ 2 ]

1 голос
/ 15 сентября 2011

Чтобы усилить комментарий выше nos:

volatile - подсказка компилятору, что переменная может быть изменена извне, и поэтому значение не должно быть помещено в регистр в качестве оптимизации; каждый раз, когда на переменную ссылаются, ее значение должно быть получено из ее местоположения в памяти.

Это замечательно, насколько это возможно, но это не делает ничего, чтобы предотвратить условия гонки с участием переменной, где t1 и t2 одновременно обновляют переменную, и вы не получаете конечного значения, которое ожидаете. В этом случае вы используете блокировку, чтобы гарантировать, что у вас есть эксклюзивный доступ к общей переменной, прежде чем вы ее измените.

Замки не без их ловушек, так как вы можете попасть в тупиковую ситуацию или иметь довольно низкую производительность, если не будете осторожны.

1 голос
/ 15 сентября 2011

Вот довольно старая статья в Dobbs о volatile и потоках http://drdobbs.com/cpp/184403766 Это бит c ++ ish, но он описывает, как можно использовать volatile.

Но также есть некоторые люди(в том числе от Intel), который говорит «Volatile: почти бесполезный для многопоточного программирования» и показывает, почему http://software.intel.com/en-us/blogs/2007/11/30/volatile-almost-useless-for-multi-threaded-programming/ Они говорят, что прямое использование атомарных операций («загрузка с приобретением и хранение с выпуском»)и барьеры памяти являются решением многопоточного обмена данными.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...