iki durumlar dışında, görünse de oldukça basit değildir: hiç eşitlemek gerekmez
sadece okuyucuları ve hiçbir yazarlar vardır
- , sen yoktur.
- Birkaç iş parçacığı yazıldığı zaman ve bunlardan en az biri okuma-değiştirme-yazma işlemi gerçekleştiriyorsa (örneğin,
++x;
) her zaman eşitlemeniz gerekir, yoksa tamamen tahmin edilemeyen sonuçlar alırsınız. Diğer tüm durumlarda
, sen en az bir yazar ve okuyucuyu (veya birkaç yazarları) varsa, genellikle (çok az istisna dışında) erişimini eşitlemek gerekir, ama mutlaka her zaman ve her zaman mümkün olan en sıkı şekilde değil.
Çok kadara ihtiyacın garanti bağlıdır. Bazı uygulamalar (ve bazen hatta kilit adalet gerekir) parçacığı üzerinde sıkı sıralı tutarlılık gerekir. Bazı uygulamalar eşit derecede iyi çalışır, ancak çok daha iyi performansa sahip, sadece varsa olur-öncekiyle aynı iş parçacığı içinde teminat olacaktır. Yine diğer uygulamalar bile o kadar ihtiyaç ve rahat operasyonlarla ya da hiç bir teminat olmaksızın tamamen mutlu değil.Bu, herhangi bir senkronizasyon olmadan gayet iyi çalışır
// worker thread
running = true;
while(running) { task = pull_task(); execute(task); }
// main thread exit code
running = false;
join(workerthread);
:
Örneğin, bir iş parçacığı bu "tipik" uygulaması bir yazar ve bir okuyucu vardır. Evet, akıcı bir şekilde konuşmak gerekirse, running
'un değeri ne zaman değişecek, ne de gerçekte hiçbir fark yaratmayacaktır. Bellek konumunun "rasgele" bir ara değere sahip olmasının hiçbir yolu yoktur ve bu değişiklik, iş parçacığının büyük olasılıkla bir görevi yürütmekle meşgul olabileceğinden, değişikliklerin birkaç düzine nanosaniye daha erken veya daha sonra görünüp görünmeyeceği gerçekten önemli değildir. En kötü durumda, birkaç milisaniye sonra değişikliği alır. Sonunda, bir sonraki yinelemede, numaralı çalışan iş parçacığı değişikliğini alacaktır ve çıkacaktır.
Dr. Dobb'ın birkaç yıl önce yayınlanan SPSC hızlı ileri kuyruğu benzer bir prensip üzerinde çalıştı, sadece işaretçilerle çalıştı.
GCC documentation adresinde birçok farklı senkronizasyon modu ve sonuçları hakkında iyi ve kapsamlı bir okuma verilir.
Vaka 2 ve 3, yani en az bir ipliğin en az bir başka iplik okuma veya yazma ile yazdığı herhangi bir durum. – juanchopanza
Farklı iş parçacıklarından veriye erişirken her zaman kilitlenmeniz gerekmez. Atomik işlemlere ve özellikle C++ 11'in std :: atomic ' – nijansen
'a bakın Ve evet, son cümlenizi ele almak için çok çekirdekli CPU'larda, çeşitli önbellek düzeylerinde her bir değerin birden çok kopyası olabilir. – Hulk