blu*_*llu 4 c parameters multithreading pthreads
我正在尝试学习C多线程,我已经看到了一些罕见的东西.
我知道将参数传递给线程必须使用指针完成.我找到了一个我不明白的例子.我将复制相关的行:
pthread_t tid[MAX_THREADS]
int n_veg
pthread_create(&tid[n],NULL,caracter,(void *)n_veg)
Run Code Online (Sandbox Code Playgroud)
caracter显然是一个预先宣布的功能.
现在,为什么我们使用void指针转换而不是int指针转换?有什么相关的区别吗?
其次,为什么我们首先使用指针式转换?我们不能像第一个参数那样使用"&n_veg"吗?
提前致谢.
cas*_*nca 10
既然你的问题都是相关的,我会一起回答:pthread_create拿一个void *参数,这样你就可以真正传递你想要的任何指针.在这种情况下,我们实际上并没有传递指针,只是一个简单的整数值作为指针.这意味着您将在caracter以下方式中访问它:
int value = (int)n_veg;
Run Code Online (Sandbox Code Playgroud)
正如您所提到的,您可以很好地传递实际指针&n_veg并检索如下所示的值:
int value = *(int *)n_veg;
Run Code Online (Sandbox Code Playgroud)
实际上,在大多数情况下,您需要传递的数据多于整数(例如结构),在这种情况下,您必须传递指针,因为您不能简单地将其转换为类似整数的指针.
传递指针时要记住的一件事是,n_veg只要线程正在运行,就不能超出范围.例如,如果你这样做:
void test() {
int n_veg;
pthread_create(&tid[n],NULL,caracter,&n_veg);
}
Run Code Online (Sandbox Code Playgroud)
然后返回时&n_veg将无效test,但线程可能仍在运行并且将持有无效的地址.因此,传递给线程的结构通常是动态分配的,比如使用malloc,并且free一旦完成,线程就可以了.
| 归档时间: |
|
| 查看次数: |
10164 次 |
| 最近记录: |