2016-03-26 34 views
3

'deki iletiler arasında paylaşın D düzgün bir şekilde çalışmak için D engel engelini almaya çalışırken bir zaman geçiriyorum. Şu anda herhangi bir derleyici hatası almıyorum, ancak engele her ulaştığında bölümleme hatası alıyorum. Ben ana işlevi tamamen bariyer tanımlayan denedimPaylaşım Bariyeri D

import std.stdio; 
import std.conv; 
import std.concurrency; 
import core.thread; 
import core.sync.barrier; 

//create barrier 
Barrier barrier; 

void the_thread() 
{ 
    barrier.wait(); //I get a segmentation fault here 
} 

void main(string[] args) 
{ 
    int threads = to!int(args[1]); //number of threads 

    //init barrier 
    barrier = new Barrier(threads); 

    //launch threads 
    foreach(i; 0 .. threads) 
    { 
     spawn(&the_thread); 
    } 
    thread_joinAll(); 
} 

ama dmd yakınır:: İşte ne temelde

static assert "Aliases to mutable thread-local data not allowed." 

Ben de paylaşılan değişken ve I olarak geçen denedim bu olsun: Eğer ana iş parçacığı barrier set, sadece ana iş parçacığı bunu ayarlandığında

non-shared method core.sync.barrier.Barrier.wait is not callable using a shared object 
+0

__gshared' o (Windows'da) benim için iş yapar 'olarak bariyer işaretleniyor. – sigod

cevap

2

Küresel değişkenler D'de varsayılan olarak parçacığı yerel; Diğer iş parçacıkları için, barrier, null olacaktır.

__gshared Barrier barrier; 

iplik spawn işlevi yalnızca, shared olarak işaretlenmiş veri geçirmediğinizi

keşfettim verir gibidir: Bir kesmek biraz olsa

Sen, bu iplik-küresel hale getirmek için __gshared olarak barrier işaretleyebilirsiniz. Ancak, Barrier.wait işlevi shared olarak işaretlenmediğinden, onu çoğunlukla yararsız yapan bir shared(Barrier) nesnesiyle çağıramazsınız. Başka hack olarak, wait çağırmadan önce paylaşılmamış ilk yayınlayabilmek için:

(cast()barrier).wait(); 
+0

Ah! D'de anlayamadığım bellek yönetiminde bir şey olacağını biliyordum. Şimdi, ikisini de hack olarak tarif ettiniz. Bu tür bir paylaşımın D'de nasıl gerçekleştirileceği ya da bunu gerçekleştirebileceğim haksız bir yol var mı? – jdeters

+0

'shared', biraz ... belirtilmiş. Benim yorumum, threadlar arasında paylaşılacak olan herhangi bir verinin “paylaşılması”, sadece “paylaşılmış” yöntemlerin “paylaşılmış” nesneler üzerinde çağrılabilmesi ve paylaşılmamış forma dönüştürülmesinin yalnızca iş parçacığının bir nesneye özel erişiminin olması durumunda tanımlanması gerektiğidir. bir muteks tarafından korunmaktadır. Yani Barrier.wait, 'Mutex.lock' vb. Gibi işlevler 'paylaşılmalı' olmalıdır, ancak bunlar IMO'nun standart kütüphanede eksik olmasıdır. –

+0

@ColonelThirtyTwo Bunun için hata izleyicisinde bilet oluşturmalısınız. – sigod