On 03/18/2016 09:14 AM, Dsby wrote:
On Friday, 18 March 2016 at 11:09:37 UTC, Atila Neves wrote:
On Friday, 18 March 2016 at 10:50:34 UTC, Dsby wrote:

foreach (i ; 0..4) {
    auto th = new Thread(delegate(){listRun(i);});//this is erro
    _thread[i]= th;
    th.start();
}

void listRun(int i)
{
     writeln("i = ", i); // the value is not(0,1,2,3), it all is 2.
}


I want to know how to use it like std::bind.

I would suggest not using Thread directly:

foreach(i; 0..4) {
    auto tid = spawn(&listRun, i); //from std.concurrency
    _tid[i] = tid;
}

Atila


the listrun is in class. it is a delegate,it is not a function.

Here is one that puts 'shared' in a lot of places:

import std.stdio;
import std.concurrency;

class C {
    int i;

    this (int i) shared {
        this.i = i;
    }

    void listRun() shared {
        writeln("listRun for ", i);
    }
}

void worker(shared(C) c) {
    c.listRun();
}

void main() {
    Tid[4] _tid;

    foreach(i; 0..4) {
        auto c = new shared(C)(i);
        auto tid = spawn(&worker, c);
        _tid[i] = tid;
    }
}

Here is an equivalent that casts to and from 'shared' before and after the thread call:

import std.stdio;
import std.concurrency;

class C {
    int i;

    this (int i) {
        this.i = i;
    }

    void listRun() {
        writeln("listRun for ", i);
    }
}

void worker(shared(C) c_shared) {
    auto c = cast(C)c_shared;
    c.listRun();
}

void main() {
    Tid[4] _tid;

    foreach(i; 0..4) {
        auto c = new C(i);
        auto c_shared = cast(shared(C))c;
        auto tid = spawn(&worker, c_shared);
        _tid[i] = tid;
    }
}

Ali

Reply via email to