Umarım başka arkadaşlar anlamışlardır.
Çok farklı konulara dokunan bir örnek olduğu için neresiyle ilgili düşüneceğimi bile anlayamadım.
-
Rasgelelikle ilgili bir gariplik mi var?
-
Rasgele bir süre uyumaları beklendiği halde aynı anda mı uyuyup uyanıyorlar?
-
Sonsuz sayıda iş parçacığı başlatıp sonlandırarak bu modülün sınırlarını mı anlamaya çalışıyoruz?
-
Doğrudan veri paylaşımının riskli olduğunu duyduğumuz halde belki de aynı yapının farklı üyelerine dokunulduğu zaman sorun olmadığını mı görmeye çalışıyoruz?
Bu programda çok fazla sayıda ve ilgisiz konu geçtiği için ve "şu çıktıya bakın" anlamında açıklama geldiği için ben hiçbir şey anlamıyorum.
Alıntı:
> ama eğer receive() işlevinde bekliyorsa neden aşağıdaki kod şakır şakır çalışıyor?
Şakır şakır çalışmayla ne kastediyorsun? Evet receive() işlevinde bekler ama bu neden şakır şakır çalışmaya engel olsun? receive() işlevinde bekler, bir iş parçacığının gönderdiği mesajı alır ve işine devam eder.
Ondan sonra çıktısında parçalanma arızası gösteriyorsun. Kafam iyice karışıyor. Yani şakır şakır çalışıyor derken parçalanma arızasını mı kastediyorsun?
Ben bu kafa karışıklığıyla durumda olaydan küçük adımlarla uzaklaşıyorum... :)
Alıntı:
> Ama döngü içinde aşırı yüklenme olduğundan bu meydana geliyor.
Belki de posta kutusunun fazla büyümesinden oluyordur.
Tam şu sırada Eş Zamanlı Programlama bölümünü bir yandan İngilizce'ye çeviriyorum, bir yandan da Türkçe'sini gözden geçiriyorum. Mesajlaşma ile veri paylaşımını iki bölüm olarak ayırmaya karar verdim ve std.concurrency modülünün diğer olanaklarını da Mesajlaşma bölümüne eklemeye karar verdim.
Oraya şöyle bir örnek eklemek üzereyim:
import std.concurrency;
import core.thread;
void işçiİşlev(Tid sahip)
{
while (true) {
sahip.send(42);
}
}
void main()
{
spawn(&işçiİşlev, thisTid);
while (true) {
receive(
(int mesaj) {
Thread.sleep(dur!"seconds"(1));
});
}
}
O programdaki işçi sahibe sürekli olarak mesaj gönderiyor. Sahip ise mesajları posta kutusundan çekip kullanmakta ona göre yavaş kalıyor. Sonuçta posta kutusu şiştikçe şişer.
Eğer senin sorunun da posta kutusunun doluluğu ile ilgiliyse setMaxMailboxSize() işlevine ihtiyacın var. Bunun çözümü için main'in en başına şu satırı ekleyebilirsin:
setMaxMailboxSize(thisTid, 1000, OnCrowding.block);
O satır, ana iş parçacığının posta kutusunun uzunluğunu 1000 olarak sınırlıyor. Üçüncü parametre için üç seçenek var:
-
OnCrowding.block: Posta kutusu doluysa gönderenler mesaja yer açılana kadar beklerler.
-
OnCrowding.ignore: Posta kutusu doluysa mesaj gözardı edilir.
-
OnCrowding.throwException: Posta kutusu doluysa mesaj gönderilirken hata atılır. Ama hata mesajı gönderen tarafında atıldığı için try-catch bloğunun işçi tarafında olması gerekiyor:
import std.concurrency;
import core.thread;
void işçiİşlev(Tid sahip)
{
while (true) {
try {
sahip.send(42);
} catch (MailboxFull hata) {
/* Gönderemedim; biraz sonra tekrar denerim. */
Thread.sleep(dur!"msecs"(1));
}
}
}
void main()
{
setMaxMailboxSize(thisTid, 1000, OnCrowding.throwException);
spawn(&işçiİşlev, thisTid);
while (true) {
receive(
(int mesaj) {
Thread.sleep(dur!"seconds"(1));
});
}
}
Ali
--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]