2011-05-12 13 views
6

He creado un simulador multiprocesado que depende en gran medida del mensaje nativo que pasa entre los hilos (no vayan diciéndome que vaya con un único hilo para mi tesis en D e I necesita hacer que esto funcione)estructura definida por el usuario no se puede pasar a través de tid.send

después de un muy dudoso kludge que involucra una gran cantidad de moldes de objetos ay desde shared. que prolly tenía algunos errores de condición de raza feos. Decidí crear un tipo opaco que representa un objeto que pueda recibir mensajes que deben ser capaces de pasar por ahí sin todo lo que la fundición ...

no hubo suerte

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." 
} 

qué puedo pasar una Tid alrededor, pero no una estructura que contiene solo a Tid?

y cómo se puede arreglar que este

+0

Como una suposición de leer el mensaje de error: Usted puede tratar de añadir una inmutable en alguna parte. – BCS

+0

agregar inmutable a Tid significa que no puedo enviar mensajes a él, es un poco contrario al propósito de tener esta estructura (std.concurrency.send no acepta Tid inmutables) –

Respuesta

2

Creo que es porque Tid tiene un campo de mensaje, que es un tipo de clase.

Puede escribir tid campo de OpaqueFaseSim como compartidos o ___gshared y funcionará:

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

Sí, me sumergí en las fuentes de lib no mucho después de hacer esta pregunta y envié un [bugfix] (http://d.puremagic.com/issues/show_bug.cgi?id=4957) para él y en mi proyecto ahora uso un Tid compartido y lo devuelvo a no compartido cuando lo envío (otro extraño comportamiento TBH) –

Cuestiones relacionadas