我需要传递多个参数给一个函数,我想在一个单独的线程上调用。我读过这样做的典型方法是定义一个结构体,向函数传递一个指向该结构体的指针,并将其解引用为参数。但是,我无法让它工作:
#include <stdio.h>
#include <pthread.h>
struct arg_struct {
int arg1;
int arg2;
};
void *print_the_arguments(void *arguments)
{
struct arg_struct *args = (struct arg_struct *)args;
printf("%d\n", args -> arg1);
printf("%d\n", args -> arg2);
pthread_exit(NULL);
return NULL;
}
int main()
{
pthread_t some_thread;
struct arg_struct args;
args.arg1 = 5;
args.arg2 = 7;
if (pthread_create(&some_thread, NULL, &print_the_arguments, (void *)&args) != 0) {
printf("Uh-oh!\n");
return -1;
}
return pthread_join(some_thread, NULL); /* Wait until thread is finished */
}
其输出应为:
5
7
但当我运行它时,我实际上得到:
141921115
-1947974263
有人知道我做错了什么吗?
9条答案
按热度按时间ztyzrc3y1#
因为你说
struct arg_struct *args = (struct arg_struct *)args;
而不是
struct arg_struct *args = arguments;
sf6xfgos2#
使用
代替
xe55xuns3#
main()
有自己的线程和堆栈变量。要么在堆中为'args'分配内存,要么使其全局化:然后当然将引用从
args->arg1
更改为args.arg1
等。a0zr77ik4#
用途:
并像这样传递参数:
别忘了free args!;)
tjvv9vkg5#
我和最初的海报有同样的问题,迈克尔。
然而,我试图申请的答案提交的原始代码没有成功
经过一些尝试和错误,这里是我的代码版本,工作(或至少为我工作!)。如果你仔细看,你会注意到它与早期发布的解决方案不同。
dm7nw8vv6#
在此代码的线程创建中,传递函数指针的地址。原始
pthread_create(&some_thread, NULL, &print_the_arguments, (void *)&args != 0)
它应该读作
pthread_create(&some_thread, NULL, print_the_arguments, (void *) &args)
一个好的方法是记住这个函数的所有参数都应该是地址。
some_thread
是静态声明的,因此地址可以使用&
正确发送。我将创建一个
pthread_attr_t
变量,然后在其上使用pthread_attr_init()
并传递该变量的地址。但是,传递NULL
指针也是有效的。函数标签前面的
&
是导致此处问题的原因。使用的标签已经是函数的void*
,所以只需要标签。用最后一个参数表示
!= 0
似乎会导致不确定的行为。添加this意味着传递的是布尔值而不是引用。AkashAgrawal的回答也是解决这段代码问题的一部分。
jm81lzqq7#
print_the_arguments的args是参数,所以你应该使用:用途:
u4vypkhs8#
-->这个赋值是错误的,我的意思是变量参数应该在这个上下文中使用。干杯!
uajslkp69#
由于asking the same question but for C++ is considered a duplicate,我也可以提供C++代码作为答案。
使用以下选项之一编译并运行: