June 12, 2022

Merhaba,

İlerleyen günlerde üzerinden gecebileceğimizi düşünüyorum; Steven'nın şu makalesi:

ile Ali hocanın bugünkü toplantıdakli örneği: (aşağıya biraz düzenleyerek naklettim)

import core.thread; // sleep için
import std.concurrency;
import std.random : uniform;
import std.range;
import std.stdio;

void işçiImpl(size_t i) {
  while (true) {
    ownerTid.send(i);
    Thread.sleep(10.msecs);
    assert(uniform(0, 5) != 3);
  }
}

void işçi(size_t i)
{
  try
  {
    işçiImpl(i);
  }
  catch (Exception exc)
  {
    ownerTid.send(cast(shared)exc);
  }
  catch (Error err)
  {
    puts("İşçi bir hata yaptı ve durdu!");
    import core.stdc.stdlib;
    exit(41); // terminalde echo $? ile 41 yakalanabilir
  }
}

void main()
{
  enum n = 4;
  foreach(i; iota(n))
  {
    spawnLinked(&işçi, i);
  } // Önce 4 işçi kurduk

  size_t sonlanan;
  while (sonlanan < n)
  {
    receive(
      (const(LinkTerminated) msg) {
        ++sonlanan;
      },

      (const(Exception) exc) {
        writeln("Hata: ", exc.msg);
      },

      (size_t i) {
        i.writeln(": ");
      });
  }
}

Error'ların yakalanmaması salık verilirken bu örnekteki işparçacıklarından birinin hatalı sonladığını bilmek için Exeception yetersiz kalıyor. Birkaç kere çalıştırın, duruma göre aynı anda 2 thread durabiliyor.

Başarılar...