Additional

Потокобезопасность

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

В частности, он должен обеспечивать правильный доступ нескольких потоков к разделяемым данным. Блокировка данных, так, чтобы к ним мог обращаться только один поток за раз – это только одна из возможных техник обеспечения потокобезопасности;

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

Гонка данных / условий

Ситуация, когда два или более потока соперничают за обладание некоторым общим ресурсом.

Чаще всего соперничество возникает из-за такого ресурса как оперативная память. Могут быть также: внешняя память (работа с одним и тем же файлом); устройство, подключенное к компьютеру.

Пример: Пусть два параллельно работающих потока выполняют некоторый фрагмент кода. Первый поток выполняет оператор присваивания:

Sum += vklad1;

Второй поток выполняет оператор присваивания:

Sum += vklad2;

Ожидаемым результатом должно быть увеличение суммы Sum, как на величину первого, так и второго вклада. Иногда так и будет, но не всегда! В ряде случаев из-за возникшей "гонки данных" сумма увеличится только на величину одного вклада, и нельзя сказать какого именно.

Оба оператора присваивания работают с общим ресурсом - переменной Sum. Оператор присваивания, рассматриваемый на уровне языка программирования, как одна операция, на уровне компьютера после трансляции превратится в группу команд. Как могут выглядеть два параллельно выполняемых потока команд компьютера:

Sum => R1        Sum => R2
Vklad1 => R3     Vklad2 => R4
R1 + R3 => R5    R2 + R4 => R6
R5 => Sum        R6 => Sum

Оба потока могут одновременно прочесть из памяти, отводимой переменной Sum, ее текущее значение и занести его на соответствующие регистры. Затем одновременно выполнить сложение в регистровой памяти. Но записать полученный результат в ячейку Sum придется последовательно. Тот поток, кто пришел первым в гонке данных, проиграет, его результат будет утерян, после того, как в эту же ячейку запишет результат второй поток.

Если эти потоки команды будут смещены по времени, и одна группа команд будет выполняться по завершении работы первой группы, то в сумме будут учтены оба вклада. Но чтобы добиться такого результата, необходимо предпринять определенные меры по синхронизации работы параллельно работающих потоков.

Dead lock

Чаще всего он случается, когда поток уже заблокировал ресурс А, после чего пытается провести блокировку Б, другой же поток заблокировал ресурс Б, после чего пытается заблокировать ресурс А. Самое печальное в этом типе багов то, что, как правило, ситуация происходит очень редко, и поймать его при тестировании практически невозможно.

Взаимная блокировка – это такое состояние системы, в котором один поток ожидает наступления чего-то, а это что-то не может произойти потому, что другой поток ожидает наступления чего-то от первого потока.

Причиной блокировок могут являться любые средства и механизмы синхронизации, которые предполагают ожидание чего-либо одного потока со стороны другого, например, ожидание сигнала на переменной кондиции (condition variable) или, что значительно менее очевидно, ожидание завершение другого потока (wait/join thread).

results matching ""

    No results matching ""