Вы можете смоделировать известный сценарий "банковского перевода" , используемый для иллюстрации транзакций базы данных.У нас есть аккаунты A и B, и нам нужно перевести 200 баксов с A на B.
C ++ - подобный псевдокоду (не тестировался)
int accountA = 200;
int accountB = 0;
void transfer( int& from, int& to, int amount )
{
//mutex acquisition should be here
if( from < amount ) {
printf( "error" );
// mutex release should be here
return;
}
from -= amount;
Sleep( 5000 ); //wait idle for 5 seconds
to += amount;
// mutex release should be here
}
void display( const int& account1, const int& account2 )
{
//mutex acquisition should be here
Sleep( 3000 ); //wait 3 seconds
printf( "%d", account1 );
printf( %d", account2 );
// mutex release should be here
}
теперь порождает два потока и выполняет transfer( accountA, accountB, 200 );
наодин и display( accountA, accountB );
на другом, начинающемся в один и тот же момент времени.
В системе без нагрузки программа покажет, что деньги исчезли «в середине перевода» - счета читаются в середине«транзакция» (проблема здесь нет транзакции), поэтому нет изоляции.С мьютексами вы увидите конечное состояние - «после передачи».