以下是经常看到的线程创建代码示例。 pthread_create使用了很多指针/地址,我想知道为什么会这样。
pthread_t threads[NUM_THREADS];
long t;
for(t=0; t<NUM_THREADS; t++){
rc = pthread_create(&threads[t], NULL, &someMethod, (void *)t);
}
使用'&amp;'是否有一个主要优势或区别引用变量数组'threads'以及'someMethod'(而不仅仅是'threads'和'someMethod')?而且,为什么't'通常作为空指针传递而不仅仅是't'?
答案 0 :(得分:2)
int pthread_create(pthread_t *thread, const pthread_attr_t *attr,
void *(*start_routine)(void*), void *arg);
您需要将pointer
传递给pthread_t
变量pthread_create
。 &threads[t]
和threads+t
实现此目标。 threads[t]
没有。 pthread_create
需要一个指针,以便它可以通过它返回一个值。
someMethod
是第三个参数的合适表达式,因为它是函数的地址。我认为&someMethod
是多余的,但我不确定。
您要将t
投射到void *
,以便将long
放入void *
。我认为long
不能保证适合void *
。即使保证存在,它也绝对是次优解决方案。为了清晰起见,您应该将指针传递给t
(&t
,不需要强制转换)并确保与预期的void *
兼容。不要忘记相应地调整someMethod
。
pthread_t threads[NUM_THREADS];
long t;
for (t=0; t<NUM_THREADS; t++) {
rc = pthread_create(&threads[t], NULL, someMethod, &t);
}