Перевірено декілька варіантів симуляції з використанням потоків на прикладі go.
- Без будь якої сихронізації
- Синхронізація на рівні кожної зміни
- ... на рівні усього списку клітин
- ... на рівні кожної з клітин що змінюються
- ... на рівні лише одної з клітин що змінюються
- Використовуючи паттерн producer/consumer
Результати симуляцій: 1.
Current cells state: 5 [5, 0, 0, 0, 0, 0, 0, 0, 0, 0]
Current cells state: 2278503 [66634, 269937, 207549, 240919, 270283, 379308, 404751, 192576, 221629, 25002]
Current cells state: 4721121 [132549, 546002, 418559, 510278, 571608, 782528, 830916, 408048, 468887, 51746]
Total cell count after simulation: 4721121
race-condition
Current cells state: 5 [5, 0, 0, 0, 0, 0, 0, 0, 0, 0]
Current cells state: 1 [0, 0, 1, 0, 0, 0, 0, 0, 0, 0]
Current cells state: 3 [1, 0, 0, 0, 0, 0, 0, 2, 0, 0]
Current cells state: 3 [0, 1, 0, 0, 0, 1, 1, 0, 2, 0]
Total cell count after simulation: 5
Протягом симуляції стан клітин не корректний, але у кінці симуляції завжди повертається до корректного стану (eventual consistency).
Current cells state: 5 [5, 0, 0, 0, 0, 0, 0, 0, 0, 0]
Current cells state: 5 [2, 0, 0, 1, 1, 0, 0, 1, 0, 0]
Current cells state: 5 [1, 1, 0, 0, 0, 1, 0, 1, 1, 0]
Total cell count after simulation: 5
Current cells state: 5 [5, 0, 0, 0, 0, 0, 0, 0, 0, 0]
Current cells state: 5 [0, 0, 1, 1, 1, 1, 1, 0, 0, 0]
Total cell count after simulation: 5
Логгер заблоковано назавжди, адже він не може отримати доступ одразу до усіх клітин і зробити снапшот (starvation).
Current cells state: 5 [5, 0, 0, 0, 0, 0, 0, 0, 0, 0]
Current cells state: 378667 [104, 275971, 26406, 23, -294, 38176, 38659, -103, -357, 82]
Current cells state: 769728 [164, 556429, 54685, 6, -452, 80003, 79592, -229, -588, 118]
Total cell count after simulation: 769728
race-condition але слабший ніж взагалі без синхронізації
Current cells state: 5 [5, 0, 0, 0, 0, 0, 0, 0, 0, 0]
Current cells state: 5 [0, 1, 2, 0, 0, 1, 0, 0, 0, 0]
Current cells state: 5 [0, 2, 0, 1, 0, 0, 1, 1, 0, 0]
Total cell count after simulation: 5
по суті еквівалентний до mutex на всі клітини одразу, але клітини симуляції мають можливість працювати швидше в залеждності від розміру буфера каналу (є трохи часу поки буфер не заповниться і не заблокує потік) та шкидкості консьюмера.