История изменений
Исправление invy, (текущая версия) :
Во-первых, не употребляй слово «лок» везде и всюду, т.к. судя по всему ты его применяешь без понимания.
Есть примитивы синхронизации:
- mutex (mutual exclusion - взаимное исключение);
- есть семафоры - переменная с функциями инкремента и декремента, если переменная равна нулю, вызов функции декремента останавливает текущую нить(или процесс), до тех пор, пока переменная не станет > 0 (потому что другая нить ее инкрементирует;
- есть еще другие примитивы/конструкции: барьеры, рандеву и т.п., но это не нужно сейчас
Есть атомарность. Атомарность - критерий накладываемый на какую-либо операцию, означающий, что операция либо выполняется непрерывно, либо не выполняется вообще. В контексте атомарной переменной - это означает, что запись или чтение в/из нее выполняются непрерывно.
То есть, грубо говоря доступ к атомарной переменной представляет из себя захват mutex'а, выполнение операции, освобождение mutex'a. Но поскольку захват mutex'а обычно трудоемкая операция, то реализация в атомарных переменных часто более легковесная, допустим основанная на spin-lock'е.
1. volatile - нужно или нет если стоят локи?
Не нужно для синхронизации вообще. volatile не для этого.
3. локи - нужно ставить во всех потоках или только там где он меняет переменную?
А ты как думаешь, если у тебя есть одноколейка (твоя переменная), нужно ли двум(и более) пытающимся въехать на нее поездам(тредам) светофоры показывать, или достаточно одному?
4. Что лучше локи или атомарные переменные?
атомарные переменные быстрее и удобнее, чем самому управлять mutex'ом.
6. Если переменная атомарная - нужно ли делать её volatile ?
нет
Исходная версия invy, :
Во-первых, не употребляй слово «лок» везде и всюду, т.к. судя по всему ты его применяешь без понимания.
Есть примитивы синхронизации:
- mutex (mutual exclusion - взаимное исключение);
- есть семафоры - переменная с функциями инкремента и декремента, если переменная равна нулю, вызов функции декремента останавливает текущую нить(или процесс), до тех пор, пока переменная не станет > 0 (потому что другая нить ее инкрементирует;
- есть еще другие примитивы/конструкции: барьеры, рандеву и т.п., но это не нужно сейчас
Есть атомарность. Атомарность - критерий накладываемый на какую-либо операцию, означающий, что операция либо выполняется непрерывно, либо не выполняется вообще. В контексте атомарной переменной - это означает, что запись или чтение в/из нее выполняются непрерывно.
То есть, грубо говоря доступ к атомарной переменной представляет из себя захват mutex'а, выполнение операции, освобождение mutex'a. Но поскольку захват mutex'а обычно трудоемкая операция, то реализация в атомарных переменных часто более легковесная, допустим основанная на spin-lock'е.
1. volatile - нужно или нет если стоят локи?
Если синхронизация без ошибок, то есть только одна нить в данный момент времени совершает операции с конкретной переменной, то не нужно. volatile не для этого.
3. локи - нужно ставить во всех потоках или только там где он меняет переменную?
А ты как думаешь, если у тебя есть одноколейка (твоя переменная), нужно ли двум(и более) пытающимся въехать на нее поездам(тредам) светофоры показывать, или достаточно одному?
4. Что лучше локи или атомарные переменные?
атомарные переменные быстрее и удобнее, чем самому управлять mutex'ом.
6. Если переменная атомарная - нужно ли делать её volatile ?
нет