下面是一个常见的线程创建代码示例。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);
}
使用'&'来指代变量数组'线程'和' someemethod '(而不仅仅是'线程'和' someemethod ')是否有主要的优势或区别?而且,为什么't'通常传递作为一个空指针,而不是只是't'?
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);
}