2011-05-12 24 views
6

İş parçacıkları arasında geçen yerel iletiye büyük ölçüde dayanan bir yanlış iş parçacıklı simülatör oluşturdum (D ve I üzerinde tkullanıcı tanımlı yapısını tid.send üzerinden geçirilemez

shared dan çok fazla sayıda nesne içeren çok durgun bir kuzgunun ardından. Hangi çirkin yarış durumu hataları vardı. Ben Tid geçebilir neden tüm bu döküm olmadan etrafında geçirilecek gerekir mesajları alabilir bir nesneyi temsil eden bir opak türü ...

böyle bir şans

struct OpaqueFaseSim{ 
    Tid tid; 
    void send(...){...} 
} 

void foo(){ 
Tid tid; 
long time; 
    OpaqueFaseSim ofs; 
    //... 
    tid.send(ofs,time);//Error: static assert "Aliases to mutable thread-local data not allowed." 
} 

oluşturmaya karar etrafında ancak içeren bir yapı değil sadece a Tid? nasıl

ve ben Tid bir sınıf tipidir MessageBox alanı var çünkü düşünüyorum bu

+0

hata mesajı okumasını: Sen orada bir yerde değişmez bir eklemeyi deneyebilirsiniz. – BCS

+0

Tid'e immutable ekleme demek, bu yapıya sahip olmanın amacını (std.concurrency.send immutable Tid kabul etmez) –

cevap

2

düzeltebilir.

paylaşılan veya ___gshared gibi OpaqueFaseSim en tid alanını yazabilirsiniz ve işe yarayacak: bir tahmin olarak

struct OpaqueFaseSim{ 
    Bar bar; 
    shared Tid tid; 
    // __gshared Tid tid; 
} 
+0

evet, bu soruyu sorduğumdan çok uzun bir süre sonra lib kaynaklarına dondum ve bunun için bir [bugfix] (http://d.puremagic.com/issues/show_bug.cgi?id=4957) gönderdim ve projemde artık paylaşılan bir Tid kullanıyorum ve gönderirken paylaşıma geri dönüyorum (başka bir garip davranış TBH) –

İlgili konular