On 10/16/2016 03:22 PM, markov wrote:

void test(string line){
...
};


void main(){
  string[] list;
  foreach (line; list)
    new Thread({test(line);}).start();
...
}


It works in an unexpected way: In D, all those threads would close over the same 'line' loop variable, which happens to point to the last string, so they all see the last string:

import std.stdio;
import core.thread;

void test(size_t i, string line){
    writefln("Thread %s: %s", i, line);
}

void main(){
    string[] list = [ "hello", "world" ];
    foreach (i, line; list)
        new Thread({test(i, line);}).start();
}

Prints:

Thread 1: world    // <-- Expected 0 and "hello"
Thread 1: world

What needs to happen is to give the thread separate variables. An easy solution is to start the thread with the arguments of a function:

    foreach (i, line; list) {
        void startThread(size_t j, string l) {
            new Thread({test(j, l);}).start();    // <-- Uses function
                                                  //     arguments
        }
        startThread(i, line);
    }

I happened to define a nested function. You can define it anywhere else.

Ali

Reply via email to