N Hz'de bir iş parçacığında paylaşılan belleğe veri yazan bir sensör var (saniyede 10Hz = 10 kez). Ayrı bir iş parçacığı bu verileri okuyor ve bazı sonuçları elde etmek için kullanıyor. Okuyucu parçanın frekansı farklıdır. Hesaplanana bağlı olarak, saniyede 8 kez veya saniyede 15 kez daha yavaş olabilir. Okuyucu iş parçacığı sadece paylaşılan bellekteki verileri okur. Verileri değiştirmez (yalnızca sonuç almak için işleyin) ve paylaşılan belleğe hiçbir şey yazmaz. Tüm süreç çok düzgün çalışıyor. Okuyucu, ihtiyaç duyulduğunda paylaşılmış hafızada ne olduğunu okunduğundan (veri için anket yapar) senkronizasyon umurumda değil. İki okuma arasında, paylaşılan belleğin içeriği değişirse, okuyucu yeni verileri kullanır. Eğer iki okuma arasında paylaşılan hafızanın içeriği değişmezse (okuyucu yazardan çok daha hızlıysa), okuyucu sadece paylaşılmış hafızada ne olursa olsun kullanır.Donanım uygulamaları için Paylaşılan Bellek (C++) kullanırken Mutex için İhtiyaç Var
Artık meslektaşım, bir muteks kullanarak paylaşılan belleğe erişimi eşitlemem gerektiğini söylüyor ancak katılmıyorum. Nedeni, erişimi kontrol etmek için bir muteks kullanırsam, yazarın paylaşımlı belleğe yazma sıklığı biraz azalır (okuyucu iş parçacığı muteks ve yazıyı kilitlediğinde). Gelecekte daha fazla okuyucuyu ele alacağız ve yazar dizisinin paylaşımlı belleğe yazabileceği sıklığın, muteks için rekabet eden iki konu daha olacağından, daha da azalacağından korkuyorum.
Yarış koşulları vb. Hakkında bilgi sahibiyim, fakat yarış koşullarını ve diğer sitelerde verilen sayısız örneklerin de benimkilerden farklı senaryoları düşündüğünü hissediyorum: İki iş parçacığı, banka dengesini okurken ve işlerken ve bir iş parçacığı daha yavaşsa veya okumada daha hızlı ve denge miktarı hatalı olarak sonuçlanıyor ... sonuçta 2000 $ yerine 2000 dolar. Ancak, benim durumumda, "banka bakiyesi" - paylaşılacak veriler bir sensör tarafından üretiliyor. Değerdeki herhangi bir değişiklik fiziksel nedenlerden kaynaklanır ve paylaşılacak veri değeri hiçbir zaman büyük miktarda atlamayacaktır.
Daha fazla bilgi: Sensör, bir mesafe ölçüm sensörüdür. Saniyede 10 kez mesafeyi ölçer. T = 1,0s olan mesafeyi 10 cm olarak söyleyin ve hafızaya yazılmıştır. Okuyucu 10cm yazan paylaşılan hafızayı okur. Okuyucunun verileri okurken veya işlerken gerçek mesafenin değişmesi durumunda, bu mesafe 10,1 cm olacak veya mesafe asla büyük miktarlarda atlamayacağı için. Bir sonraki ankette, okuyucu 10.1cm'lik mesafeyi okuyacaktır (nesnenin durağan olduğunu varsayarak). Bu şekilde, yazar dizim, bir muteksin kilitlenmesini beklemeden mümkün olduğunca hızlı yazabilir.
Gerekçelendirmem yanlış mı? Hayal edebileceğim tek sorun, yazarım ve okuyucu iş parçacıklarımın aynı anda belleğe erişmeye çalışmasıdır. Ama sonra, zamanlayıcı talimatlar arasında geçiş yapmak gerekiyor, değil mi? Yani, sadece sahte paralel işlem, doğru mu? Bu, her ikisinin de belleğe aynı anda erişemedikleri anlamına gelir, değil mi?
Sorunuza TL; DR bölümü eklemek isteyebilirsiniz. –
Sadece bir iş parçacığına sahip olduğunuz sürece güvende olduğunuzu düşünüyorum. – Marco
Genel olarak, paylaşılan belleğin korunmasını kullanmalısınız (ör. Bir muteks). Ancak, belirli bir platform için kodlama yapıyorsanız ve taşınabilir kodlara gerek duymuyorsanız ve veri türleri basit (yerel) türlerse, mutex olmadan da yapabilirsiniz. Bu, sisteminizin düşük seviyeli bilgisine ihtiyaç duyacaktır. – 4386427