user1766777
user1766777

Reputation: 23

Passing a parameter to threads in a loop

I need to create 10 threads and print out the threadId with which thread printed.

#include <windows.h>
#include <stdio.h>

DWORD WINAPI xprint(LPVOID Param)
{
DWORD tID = GetCurrentThreadId();
int count = *(int*)Param + 1;

fprintf(stderr, "Thread Number:%d ThreadID:%d\n", count, tID);

return 0;
}

int main ()
{
   DWORD ThreadID[10];
   HANDLE ThreadHandle[10];
   int i;

   for(i=0; i<10; i++){

    ThreadHandle[i] = CreateThread(
      NULL,
          0,
          xprint,
          &i,
          0,
          &ThreadID[i]);

    if (ThreadHandle[i] == NULL) {
        fprintf(stderr,"Can't create thread!\n");
        return -1;
        }
    }

    for (i=0; i<10; i++){
            WaitForSingleObject(ThreadHandle[i],INFINITE);
        CloseHandle(ThreadHandle[i]);
    }
}

output:

Thread Number:1 ThreadID:4952
Thread Number:1 ThreadID:5284
Thread Number:1 ThreadID:5084
Thread Number:1 ThreadID:5656
Thread Number:1 ThreadID:5292
Thread Number:1 ThreadID:3072
Thread Number:1 ThreadID:5904
Thread Number:1 ThreadID:3620
Thread Number:1 ThreadID:6056
Thread Number:1 ThreadID:5676

I don't know where i did wrong. my desired output should look something like this.

output:

Thread Number:10 ThreadID:4952
Thread Number:8 ThreadID:5284
Thread Number:3 ThreadID:5084
Thread Number:9 ThreadID:5656
Thread Number:1 ThreadID:5292
Thread Number:2 ThreadID:3072
Thread Number:5 ThreadID:5904
Thread Number:6 ThreadID:3620
Thread Number:4 ThreadID:6056
Thread Number:7 ThreadID:5676

The Thread Number should be *out of order.

* After posting this question i ran the program a few more times output:

Thread Number:2 ThreadID:4500
Thread Number:7 ThreadID:5740
Thread Number:7 ThreadID:3772
Thread Number:1 ThreadID:4732
Thread Number:2 ThreadID:4252
Thread Number:2 ThreadID:4264
Thread Number:2 ThreadID:5544
Thread Number:2 ThreadID:4116
Thread Number:2 ThreadID:5240
Thread Number:2 ThreadID:4804

it seems like the thread number is random. but in any case, no same number should appear twice.

Upvotes: 2

Views: 858

Answers (3)

Remy Lebeau
Remy Lebeau

Reputation: 598414

Change this:

&i

to this:

(void*)i

And this:

int count = *(int*)Param + 1

to this:

int count = ((int)Param) + 1;

Upvotes: 0

bobbybee
bobbybee

Reputation: 1788

I'm not on a Windows machine, so I can't test this, but in a program I wrote I made an array of all the value, and did a pointer to the array element (int numbers[100]; &number[i]). The reason this worked was cause i was changing while the second thread was running.

Upvotes: 0

littleadv
littleadv

Reputation: 20282

Instead of &i, why don't you just pass i and cast it back as needed? You're passing the same address to all your threads.

Upvotes: 2

Related Questions