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