所以我有这个
void* tf(void* p);
我完全不明白。我认为它是一个带有参数的void指针的函数指针。我用它来制作这样的线程:
pthread_create( &thread_id[i], NULL, tf, NULL );
我需要的是tf的表达以及如何将参数传递给它。
我将函数定义为
void* tf(void* p)
{
//I would like to use p here but dont know how.
}
此函数在main之外,需要获取在main中设置的一些其他参数。我试过让它看起来像这个tf(int i),但我得到一个段错误。所以我知道我做错了什么,需要一些帮助来搞清楚。
感谢您对此事的任何帮助。
杰森
答案 0 :(得分:1)
pthread_create( &thread_id[i], NULL, tf, NULL );
// ^^^^^
// You have to put here the pointer (address) to your data
然后您可以将p
指针中的数据导入线程函数
实施例
typedef struct test {
int a,b;
} test;
int main()
{
struct test T = {0};
pthread_create( &thread_id[i], NULL, tf, &T );
pthread_join(thread_id[i], NULL); // waiting the thread finish
printf("%d %d\n",T.a, T.b);
}
void* tf(void* p)
{
struct test *t = (struct test *) p;
t->a = 5;
t->b = 4;
}
答案 1 :(得分:0)
pthread_create
的最后一个参数传递给线程函数。
因此,在您的情况下,定义要传递给线程函数的内容,以便在线程创建函数中传递其地址。像
//in main
char *s = strdup("Some string");
pthread_create( &thread_id[i], NULL, tf, s );
...
void* tf(void* p)
{
char *s = (char *) p;
// now you can access s here.
}
答案 2 :(得分:0)
回调函数的void参数可以是指向您想要的任何内容的指针,也可以是指向任何内容的指针(NULL)。你只需要正确地投射它。 tf
函数本身就是期望执行子线程工作的函数,如果你希望它在退出时返回某种值,那么你将它作为指针返回就像你在你传递了开始线程的参数。
struct settings
{
int i;
int j;
char* str;
};
void* tf( void* args )
{
int result = 0;
struct settings* st = (struct settings*)args;
// do the thread work...
return &result;
}
int main( int argc, char** argv )
{
struct settings st;
st.i = atoi( argv[1] );
st.j = atoi( argv[2] );
st.str = argv[3];
pthread_create( &thread_id[i], NULL, tf, &st );
// do main work...
}
答案 3 :(得分:0)
tf
只是一个接收void *
参数并在结尾返回void *
值的函数。到目前为止没有函数指针。
pthread_create
需要指向要执行的函数的指针,因此您需要传递tf
来传递&tf
的位置,而不是传递tf
。
void *
只是一个完全通用的指针。所以你把它投射到你传入的任何东西上,因此:
int a = 4;
void * a_genptr = (void *)&a;
pthread_create(... &tf ... a_genptr ...);
void * tf(void * arg) {
int thatIntIWanted = *(int *)arg; // cast void * to int *, and dereference
}
中看到相关示例