我一直在查看以下用于在c ++中执行代码作为pthread的工作代码:
void * PrintHello(void * blank) {
cout << "Hello World" << endl
}
...
pthread_create(&mpthread, NULL, PrintHello, NULL);
我想知道为什么我需要使用void *方法而不是void方法,并且也需要使用参数。为什么它们需要成为指针,这种void方法和void争论的区别是什么。
答案 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);
^^^
...
}