陷入线程问题

时间:2013-05-08 13:46:21

标签: c multithreading function-pointers

所以我有这个

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 个答案:

答案 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

C中的

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
}

您可以在this other SO question

中看到相关示例