November 15, 2021

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

November 15, 2021
On 11/15/21 3:08 AM, Salih Dincer wrote:

> shared vermeyince derlenmiyor.

O, spawn'ın bir yardımı: shared olmayan veri ile çalışan işlevler o verinin spawn aracılığıyla paylaştırıldığını bilmeyeceklerinden hiç mutex vs. kullanmayacaklardır. (Çünkü parametreleri örneğin 'shared' değildir.) Eğer spawn izin verseydi, bu korumasız paylaşım hatalara neden olurdu.

spawn'ın kullanılmadığı durumlarda buna dikkat etmek, C ve C++'ta olduğu gibi, bize kalır.

Ali