Here is an example of thread creation code that is often seen. pthread_create uses a lot of pointers/addresses and I was wondering why this is so.
pthread_t threads[NUM_THREADS];
long t;
for(t=0; t<NUM_THREADS; t++){
rc = pthread_create(&threads[t], NULL, &someMethod, (void *)t);
}
Is there a ma开发者_JAVA百科jor advantage or difference for using the '&' to refer to the variable array 'threads' as well as 'someMethod' (as opposed to just 'threads' and just 'someMethod')? And also, why is 't' usually passed as a void pointer instead of just 't'?
int pthread_create(pthread_t *thread, const pthread_attr_t *attr,
void *(*start_routine)(void*), void *arg);
You need to pass a pointer
to a pthread_t
variable to pthread_create
. &threads[t]
and threads+t
achieve this. threads[t]
does not. pthread_create
requires a pointer so it can return a value through it.
someMethod
is a suitable expression for the third argument, since it's the address of the function. I think &someMethod
is redundantly equivalent, but I'm not sure.
You are casting t
to void *
in order to jam a long
into a void *
. I don't think a long
is guaranteed to fit in a void *
. It's definitely a suboptimal solution even if the guarantee exists. You should be passing a pointer to t
(&t
, no cast required) for clarity and to ensure compatibility with the expected void *
. Don't forget to adjust someMethod
accordingly.
pthread_t threads[NUM_THREADS];
long t;
for (t=0; t<NUM_THREADS; t++) {
rc = pthread_create(&threads[t], NULL, someMethod, &t);
}
精彩评论