Thread overview
Whitch can replace std::bind/boost::bind ?
Mar 18, 2016
Dsby
Mar 18, 2016
Atila Neves
Mar 18, 2016
Dsby
Mar 18, 2016
Ali Çehreli
Mar 19, 2016
Dsby
Mar 18, 2016
Marc Schütz
Mar 18, 2016
Ali Çehreli
Apr 22, 2016
Dsby
March 18, 2016
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.


March 18, 2016
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
March 18, 2016
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.

This is a bug in the compiler:
https://issues.dlang.org/show_bug.cgi?id=2043
March 18, 2016
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.
March 18, 2016
On 03/18/2016 03:50 AM, 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.
>
>

A workaround is an intermediate function that returns the delegate:

import std.stdio;
import core.thread;

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

auto makeClosure(int i) {
    return delegate(){listRun(i);};
}

void main() {
    Thread[4] _thread;

    foreach (i ; 0..4) {
        auto th = new Thread(makeClosure(i));
        _thread[i]= th;
        th.start();
    }
}

Prints different values:

i = 1
i = 0
i = 2
i = 3

Ali

March 18, 2016
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

March 19, 2016
On Friday, 18 March 2016 at 17:31:11 UTC, Ali Çehreli wrote:
> On 03/18/2016 09:14 AM, Dsby wrote:
>> [...]
>
> Here is one that puts 'shared' in a lot of places:
>
> import std.stdio;
> import std.concurrency;
>
> [...]

thanks.
April 22, 2016
On Friday, 18 March 2016 at 17:24:27 UTC, Ali Çehreli wrote:
> On 03/18/2016 03:50 AM, 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.
>>
>>
>
> A workaround is an intermediate function that returns the delegate:
>
> import std.stdio;
> import core.thread;
>
> void listRun(int i)
> {
>      writeln("i = ", i); // the value is not(0,1,2,3), it all is 2.
> }
>
> auto makeClosure(int i) {
>     return delegate(){listRun(i);};
> }
>
> void main() {
>     Thread[4] _thread;
>
>     foreach (i ; 0..4) {
>         auto th = new Thread(makeClosure(i));
>         _thread[i]= th;
>         th.start();
>     }
> }
>
> Prints different values:
>
> i = 1
> i = 0
> i = 2
> i = 3
>
> Ali

Thanks for your mind.
i write the bind function:

import std.stdio;
import core.thread;
import std.functional;

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

}


void listRun(int i)
{
     writeln("i = ", i);
}


void main() {
    Thread[4] _thread;
    Thread[4] _thread2;
     AA a = new AA();
    foreach (i ; 0..4) {
        auto th = new Thread(bindDg(&a.show,i));
        _thread[i]= th;
        auto th2 = new Thread(bindFun!listRun(i + 10));
        _thread2[i]= th2;
    }

    foreach(i;0..4)
    {
        _thread[i].start();
    }

    foreach(i;0..4)
    {
        _thread2[i].start();
    }

}


auto bindDg(T, Args...)(T fun,Args args) if (is(T == delegate) || is(T == function))
{
	return delegate(){return fun(forward!args);};
}

auto bindFun(alias Fun,Args...)(Args args) {
	return delegate(){return Fun(forward!args);};
}


my value  is :
i = 2
i = 0
i = 3
i = 11
i = 13
i = 10
i = 12
i = 1