can this value be a specific value for this thread ?
Well, first thing's first, you probably want this:
int id = *((int*) param);
i.e. you need to dereference the parameter pointer after giving it a pointer with a type. You cannot dereference a void pointer, because void has no type.
Now - what happens here? Well, first we need to understand threads a bit.
Firstly - there is no distinction between a thread and a process in the kernel in Linux. Absolutely none. They're all contexts of execution, or tasks. However, one major difference is that threaded tasks share data - except for thread stacks. Reading that answer, you can see that a thread shares almost everything else with its creator.
A stack, however, must not be shared. Stacks track a number of things, for example where the program is up to execution-wise, return values and function parameters on some systems. Automatic storage duration variables - those without any other modifier - declared inside a function are also stored on the stack.
Which means - variables declared inside your thread function are unique to that thread. So, given your function:
void threadfunc(void* param)
{
int id = /* ??? */
}
Each thread has its own copy of int id
stored locally that will last for the duration of the thread. You can pass this to subsequent functions by value, or a pointer to it.
As such, it is perfectly valid to call:
int tParam[] = {1,2,3};
rc = pthread_create(&threads[0], NULL, Thread_Pool, (void *)&(tParam[0]));
rc = pthread_create(&threads[1], NULL, Thread_Pool, (void *)&(tParam[1]));
rc = pthread_create(&threads[2], NULL, Thread_Pool, (void *)&(tParam[2]));
and so on.