Reputation: 23
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
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
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
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