void指针函数的用法

时间:2013-05-24 09:12:39

标签: c++ pointers pthreads

我一直在查看以下用于在c ++中执行代码作为pthread的工作代码:

void * PrintHello(void * blank) { 
    cout << "Hello World" << endl
}
...
pthread_create(&mpthread, NULL, PrintHello, NULL);

我想知道为什么我需要使用void *方法而不是void方法,并且也需要使用参数。为什么它们需要成为指针,这种void方法和void争论的区别是什么。

2 个答案:

答案 0 :(得分:1)

你需要使用一个带void*的方法,因为它被pthread库调用,而pthread库传递你的方法void* - 你传递的同一个指针{{1} }作为最后一个参数。

以下是如何使用单个pthread_create将任意参数传递给线程的示例:

void*

即使你的函数不想接受任何参数或返回任何东西,因为pthread库传递它的参数并收集它的返回值,你的函数需要有适当的签名。将指针传递给不带参数的struct my_args { char *name; int times; }; struct my_ret { int len; int count; }; void * PrintHello(void *arg) { my_args *a = (my_args*)arg; for (int i = 0 ; i != a->times ; i++) { cout << "Hello " << a->name << endl; } my_ret *ret = new my_ret; ret->len = strlen(a->name); ret->count = strlen(a->name) * a->times; // If the start_routine returns, the effect is as if there was // an implicit call to pthread_exit() using the return value // of start_routine as the exit status: return ret; } ... my_args a = {"Peter", 5}; pthread_create(&mpthread, NULL, PrintHello, &a); ... void *res; pthread_join(mpthread, &res); my_ret *ret = (my_ret*)(*res); cout << ret->len << " " << ret->count << endl; delete ret; 函数代替带有一个参数的void函数将是未定义的行为。

答案 1 :(得分:0)

int pthread_create(pthread_t *thread, const pthread_attr_t *attr,
    void *(*start_routine)(void*), void *arg);
  

创建线程执行start_routine,arg作为唯一   论点。 如果start_routine返回,则效果就像是有效果一样   使用返回值对pthread_exit()的隐式调用   start_routine作为退出状态。1

start_routine的返回值将作为参数传递给pthread_exit()。在结束点,pthread_create将起作用(这个例子只是为了让它易于描述):

int pthread_create(pthread_t *thread, const pthread_attr_t *attr,
    void *(*start_routine)(void*), void *arg)
{   ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

  ...

  void *ret = start_routine(arg);
        ^^^                 ^^^

  pthread_exit(ret);
               ^^^

  ...

}