2013-11-02 1 views
-1

В CI есть: языкОдновременные грузы и магазины

double balance; 
void deposit(double amount) 
{balance = balance +amount;} 

машины:

load R1, balance 
load R2, amount 
add R1, R2 
store R1, balance 

Если переменная баланса содержит 500 и два потока запустить процедуру для осаждения 300 и 200, соответственно, одновременно, как может это проблематично? И как я могу использовать механизм параллелизма для обеспечения безопасности этой процедуры?

ответ

4

Параллелизм 101

Thread 1     Thread 2 

load R1, balance 
load R2, amount   load R1, balance 
add R1, R2    load R2, amount 
store R1, balance   add R1, R2 
          store R1, balance 

от записи Нитями 1 теряется. (Существует множество последовательностей, которые достигают примерно одного и того же результата.)

Вы фиксируете его, блокируя balance, чтобы доступ к нему только между одним или другим потоком между загрузкой и хранилищем. Приобретите мьютекс на balance в начале последовательности и отпустите его в конце. Рассмотрим загрузку amount перед загрузкой balance, чтобы уменьшить объем мьютекса до минимума.

+0

Большое вам спасибо! – NewFile