c - 如何正确地将参数传递给c多线程中的线程

标签 c multithreading parameters pthreads

我正在尝试学习 C 多线程,并且我看到了一些罕见的东西。

我明白给线程传递参数必须用指针来完成。我找到了一个我不明白的例子。我将复制相关行:

pthread_t tid[MAX_THREADS]
int n_veg
pthread_create(&tid[n],NULL,caracter,(void *)n_veg)

caracter 显然是一个预先声明的函数。

现在,为什么我们使用 void 指针转换而不是 int 指针转换?有什么相关的区别吗?

其次,为什么我们首先使用指针转换?我们不能像第一个参数一样使用“&n_veg”吗?

提前致谢。

最佳答案

因为你的两个问题都是相关的,我会一起回答:pthread_create 有一个void * 参数,所以你真的可以传入任何你想要的指针。但是在这种情况下,我们实际上并没有传递一个指针,而只是一个转换为指针的简单整数值。这意味着您将在 caracter 中像这样访问它:

int value = (int)n_veg;

正如您所提到的,您可以很好地将实际指针作为 &n_veg 传递并像这样检索值:

int value = *(int *)n_veg;

事实上,在大多数情况下,您需要传递的数据不仅仅是一个整数,例如结构,在这种情况下,您必须传递一个指针,因为您不能只需将其转换为类似于整数的指针。

传递指针时要记住的一件事是,只要线程正在运行,n_veg 就不能超出范围。例如,如果您这样做:

void test() {
  int n_veg;
  pthread_create(&tid[n],NULL,caracter,&n_veg);
}

然后 &n_veg 将在 test 返回后立即无效,但线程可能仍在运行并将持有无效地址。因此,传递给线程的结构通常是动态分配的,比如使用 malloc,线程可以在完成后释放它。

关于c - 如何正确地将参数传递给c多线程中的线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4221019/

相关文章:

c++ - 英特尔线程构建模块性能不佳

powershell - 动态参数 - 使用 Dynamic ValidateSet

c - 与 aio_context 关联的资源

安卓 "Only the original thread that created a view hierarchy can touch its views."

c# - Ubuntu终端上的.NET Core参数十进制错误

c# - 添加了 OracleCommand 参数但抛出异常

c - 为什么 clock_gettime 是异步信号安全的

c - 从字符集高效地创建顺序词表

c - 为没有 .so 文件的共享库构建

C - 三元运算符