1

所以我有这个

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) 但我得到一个段错误。所以我知道我做错了什么,需要一些帮助来解决。

感谢您在这方面的任何帮助。

杰森

4

4 回答 4

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;
}
于 2013-05-08T13:51:45.743 回答
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.

}
于 2013-05-08T13:53:11.610 回答
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...
}
于 2013-05-08T13:53:13.767 回答
0

tf只是一个接收void *参数并在最后返回void *值的函数。到目前为止还没有函数指针。

pthread_create需要一个指向要执行的函数的指针,因此tf您需要传递&tf传递tf的位置而不是传递。

void *在 C 中只是一个完全通用的指针。所以你把它投射到你传入的任何东西上,因此:

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
}

您可以在另一个 SO question中看到一个示例

于 2013-05-08T13:56:06.940 回答