LINUX.ORG.RU

История изменений

Исправление 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 ?

нет