user1632018
user1632018

Reputation: 2555

Creating X amount of threads that execute a task at the same time

I am trying to dynamically create X amount of threads(specified by user) then basically have all of them execute some code at the exact same time in intervals of 1 second.

The issue I am having is that the task I am trying to complete relies on a loop to determine if the current IP is equal to the last. (It scans hosts) So since I have this loop inside, it is going off and then the other threads are not getting created, and not executing the code. I would like them to all go off at the same time, wait 1 second(using a timer or something else that doesnt lock the thread since the code it is executing has a timeout it waits for.) Can anyone help me out? Here is my current code:

            int threads = Convert.ToInt32(txtThreads.Text);
            List<Thread> workerThreads = new List<Thread>();
            string from = txtStart.Text, to = txtEnd.Text;
            uint current = from.ToUInt(), last = to.ToUInt();

            ulong total = last - current;

            for (int i = 0; i < threads; i++)
            {
                Thread thread = new Thread(() =>
                {
                    for (int t = 0; t < Convert.ToInt32(total); t += i)
                    {
                        while (current <= last)
                        {
                            current = Convert.ToUInt32(current + t);
                            var ip = current.ToIPAddress();
                            doSomething(ip);
                        }
                    }
                });
                workerThreads.Add(thread);
                thread.Start();
            }

Upvotes: 0

Views: 892

Answers (2)

whoisj
whoisj

Reputation: 388

Don't use a lambda as the body of your thread, otherwise the i value isn't doing what you think it's doing. Instead pass the value into a method.

As for starting all of the threads at the same time do something like the following:

private object syncObj = new object();

void ThreadBody(object boxed)
{
    Params params = (Params)boxed;

    lock (syncObj)
    {
        Monitor.Wait(syncObj);
    }

    // do work here
}

struct Params
{
    // passed values here
}

void InitializeThreads()
{
    int threads = Convert.ToInt32(txtThreads.Text);
    List<Thread> workerThreads = new List<Thread>();
    string from = txtStart.Text, to = txtEnd.Text;
    uint current = from.ToUInt(), last = to.ToUInt();

    ulong total = last - current;

    for (int i = 0; i < threads; i++)
    {
        Thread thread = new Thread(new ParameterizedThreadStart(this.ThreadBody, new Params { /* initialize values here */ }));
        workerThreads.Add(thread);
        thread.Start();
    }

    lock(syncObj)
    {
        Monitor.PulseAll(syncObj);
    }
}

Upvotes: 3

Bryan B
Bryan B

Reputation: 4535

You're running into closure problems. There's another question that somewhat addresses this, here.

Basically you need to capture the value of i as you create each task. What's happening is by the time the task gets around to actually running, the value of i across all your tasks is the same -- the value at the end of the loop.

Upvotes: 0

Related Questions