有一个函数pthread_create()
的模板如下所示:
int pthread_create(pthread_t *pth, pthread_attr_t *att, void * (*function)(void *), void *arg);
我对此功能有一些疑问:
1)在不同的来源中调用一个函数看起来不同,哪一个是正确的,有什么区别吗?
void * fun(void *arg){
int count = * (int *)arg;
printf("Thread %d\n", count);
pthread_exit(NULL);
}
int main(void)
{
pthread_t thread;
int count = 1;
pthread_create(&thread, NULL, fun, &count); // первый способ
pthread_create(&thread, NULL, &fun, &count); // второй способ
pthread_exit(NULL);
}
2)为什么,当我们将一个函数传递给pthread_create()
一个函数fun()
时,我们不传递任何参数给它?相反,我在某处读到fun()
第四个函数参数被传递给函数pthread_create()
,但我不明白这是如何完成的。
3)该函数pthread_create()
将指针作为第一个参数pthread_t *
,这样做是为了节省内存等,还是因为地址起着某种作用?只是下面的代码证明了地址无关紧要:
void * fun(void *arg){
int count = * (int *)arg;
printf("Thread %d\n", count);
pthread_exit(NULL);
}
int main(void)
{
int i = 0;
int *status;
while(i < 10){
pthread_t thread;
status = malloc(1);
*status = i++;
pthread_create(&thread, NULL, fun, (void *)status);
printf("%ld\n", thread);
}
在这里,10
线程被创建,并且y地址thread
没有改变。
1)在si的情况下,两个选项都是正常的(据我所知)。
2)将函数的地址传递给pthread_create。因此,没有括号。如果有括号,将调用该函数。pthread_create 创建线程本身(这隐藏在操作系统的内部。然后它转换到作为参数传递给它的函数。并且还小心地将参数压入堆栈。
3) 根据文档
原则上,该函数也可以返回pthread_t,但这里有很多问题。例如,如何检查线程是否已创建,线程结束时如何处理 pthread_t 变量 - 是否调用函数对其进行清理。以及许多其他问题。在 Python 等语言中,您可以返回一个包含两个值的元组,但在 C 中,您需要返回一个指向该结构的指针,然后清理内存。
但是问题来了,为什么这个变量(pthread_t 类型)?这是允许您控制流量的手柄。其他流函数将此变量作为参数。例如,pthread_join 等待执行。
在您的情况下,“没关系”,因为您创建线程并让它们自由。