Merhaba,
std.concurrency satır 2796'da harika bir örneğe rast geldim!
Vee bir kaç satır geliştirdim:
import std.concurrency, std.stdio, core.atomic;
shared void delegate() lumpSum = () {
auto counts = receiveOnly!(shared(int)[]);
foreach(ref n; counts) {
atomicOp!"+="(n, 1);
ownerTid.send(true);
}
};
shared void delegate() singleAccess = () {
auto arr = receiveOnly!(shared(int)[]);
arr[0] = 42;
ownerTid.send(true);
};
void main() {
auto x = new shared(int)[3];
// == shared int[] x = [ 0, 0, 0 ];
auto tid = singleAccess.spawn();
tid.send(x); // x[0] = 42 yapacak...
receiveOnly!(bool);
x.writeln;
// Pratik Yöntem:
lumpSum.spawn.send(x); // sırasıyla [ 43, 1, 1 ] olacak...
receiveOnly!(bool);
x.writeln;
}/* ÇIKTISI:
[42, 0, 0]
[43, 1, 1]
*/
Burda paylaşılan sadece x dizisi ama dikkat main() içinde ve dışarıdaki temsilci işlevleri aslında paylaşmaya gerek yok ama shared vermeyince derlenmiyor. İki işlev de hanım hanımcık, kardeşce işlerini yapıp haber veriyorlar. Her ikisi de aynı dizi üzerinde ama sırayla tabi :)
Sevgiler...