C++ 返回类型Pthread Create使用C++;

C++ 返回类型Pthread Create使用C++;,c++,multithreading,pthreads,C++,Multithreading,Pthreads,我正在尝试创建一个函数,该函数返回具有特定类型的对象。问题是createthread不接受它。有人能帮我写下面的代码吗 struct thread_args { Key *k; QNode *q; uint8_t USED_DIMENSION; }; QLeafNode *st ; struct thread_args Structthread2; Structthread1.k=min; Structthread1.q=start;

我正在尝试创建一个函数,该函数返回具有特定类型的对象。问题是createthread不接受它。有人能帮我写下面的代码吗

struct thread_args
 {
    Key *k;
    QNode *q;
    uint8_t USED_DIMENSION;
};

QLeafNode *st ;
  struct thread_args Structthread2;
     Structthread1.k=min;
     Structthread1.q=start;
      Structthread1.USED_DIMENSION=4 ;

pthread_create( &thread1, NULL,(void*)&FindLeafNode,  ((void *) &Structthread1));
pthread_join( thread1, (void**)st);

QLeafNode* FindLeafNode (Key *k, QNode * r, uint8_t USED_DIMENSION ){

}

返回一个堆分配的指针到[因此使用
new
分配它]您的新对象(在线程中分配,稍后可能在连接它的“父”线程中释放,即使用结果)。

返回一个堆分配的指针到[因此使用
new
分配它]您的新对象(在线程中分配,稍后可能在连接它的“父”线程中释放,即使用结果)。

首先,您的线程函数没有正确定义。只有以下形式的函数:

void* function_name(void* param)
可以传递到
pthread\u create

现在,为了从该函数返回指向某个对象的指针,您需要两个pthread函数:

pthread_exit(void *value_ptr);
在线程函数内部调用此函数,通过
value\u ptr
返回一个值,然后

pthread_join(pthread_t thread, void **value_ptr);
在父线程内调用此函数,以等待具有句柄的子线程终止
thread
,并在
value\u ptr
中检索
pthread\u exit
返回的值

因此,您的代码应该如下所示:

struct thread_args
 {
    Key *k;
    QNode *q;
    uint8_t USED_DIMENSION;
};

QLeafNode *st ;
struct thread_args Structthread1;
Structthread1.k=min;
Structthread1.q=start;
Structthread1.USED_DIMENSION=4 ;

pthread_create(&thread1, NULL, FindLeafNode,  ((void *) &Structthread1));
pthread_join(thread1, (void**)st);

...

void* FindLeafNode (void* param) {
    struct thread_args* value = (struct thread_args*) param;
    // use value for computations
    QLeafNode* result = ... // allocate result with new / malloc
    pthread_exit((void*)result);
}

首先,您的线程函数没有正确定义。只有以下形式的函数:

void* function_name(void* param)
可以传递到
pthread\u create

现在,为了从该函数返回指向某个对象的指针,您需要两个pthread函数:

pthread_exit(void *value_ptr);
在线程函数内部调用此函数,通过
value\u ptr
返回一个值,然后

pthread_join(pthread_t thread, void **value_ptr);
在父线程内调用此函数,以等待具有句柄的子线程终止
thread
,并在
value\u ptr
中检索
pthread\u exit
返回的值

因此,您的代码应该如下所示:

struct thread_args
 {
    Key *k;
    QNode *q;
    uint8_t USED_DIMENSION;
};

QLeafNode *st ;
struct thread_args Structthread1;
Structthread1.k=min;
Structthread1.q=start;
Structthread1.USED_DIMENSION=4 ;

pthread_create(&thread1, NULL, FindLeafNode,  ((void *) &Structthread1));
pthread_join(thread1, (void**)st);

...

void* FindLeafNode (void* param) {
    struct thread_args* value = (struct thread_args*) param;
    // use value for computations
    QLeafNode* result = ... // allocate result with new / malloc
    pthread_exit((void*)result);
}


关键代码不在这里。Structthread1是如何声明的?什么是“创建线程不接受它”意味着什么?您是否遇到编译错误?崩溃?如果我不得不猜测的话,这是
void*
FindLeafNode
上的强制转换(还有一种奇怪的期望,即当一个具有3个参数的函数收到一个参数时,代码会做一些合理的事情)@AdamBatkin是的,它不编译:((,即使示例与windows相关,也适用相同的逻辑。关键代码不在这里。Structthread1是如何声明的?什么是“创建线程不接受它”意味着什么?你得到编译错误了吗?崩溃了吗?如果我不得不猜测的话,是
void*
FindLeafNode
上强制转换的。(还有一种奇怪的期望,即当一个有3个参数的函数收到一个参数时,代码会做一些合理的事情)@AdamBatkin是的,它不编译:(,即使这些示例与windows相关,同样的逻辑也适用。问题是,它不为pthread_create编译:((你是如何编译它的(哪个系统、哪个编译器、哪个编译器选项)你编译了什么源代码,你得到了什么确切的错误消息?四叉树。cc: 332:错误:ISO C++禁止接受不合格或括号的非静态成员函数的地址来形成指向成员函数的指针。说‘&四叉树::FofLutoNoDe'四叉树。cc: 332:错误:无效的从“空虚*”转换为“空洞*”()(void)
pthread\u create
需要一个例程指针(例如例程的名称)作为它的第三个参数。如果
FindLeafNode
是一个函数,只需传递它的名称即可。问题是它一开始并没有为pthread\u create编译:((你是如何编译它的(哪个系统,哪个编译器,哪个编译器选项)你编译了什么源代码,你得到了什么确切的错误消息?四叉树。cc: 332:错误:ISO C++禁止接受不合格或括号的非静态成员函数的地址来形成指向成员函数的指针。说‘&四叉树::FofLutoNoDe'四叉树。cc: 332:错误:无效的从“空虚*”转换为“空洞*”()(void)
pthread_create
需要例程指针(例如例程的名称)作为它的第三个参数。如果
FindLeafNode
是一个函数,只需传递它的名称。从技术上讲,我认为应该传递
&FindLeafNode
,而不是
FindLeafNode
@Hurkyl:据我所知不是这样。我最近实际上使用了pthreads,它只与
FindLeafNode
.QuadTree一起工作。cc:332:错误:类型参数e“void*(四叉树::)(void*)”与“void*()(void)”不匹配'那么,
FindLeafNode
QuadTree
的成员吗?那么我们可能会有问题,因为指向函数的指针与指向成员的指针不同。例如,请参阅此讨论:。是否可能使用make
FindLeafNode
static?thnx@Tudor作为您的精彩解释,但我认为出现错误的原因是:创建Pthread的第三个参数有问题!从技术上讲,我相信您应该传递
&FindLeafNode
,而不是
FindLeafNode
@Hurkyl:据我所知不是。我最近实际使用了pthreads,它只与
FindLeafNode
.QuadTree一起工作。cc:332:错误:类型为'void'的参数(四叉树::)(void*)'与'void*()(void)不匹配'那么,
FindLeafNode
QuadTree
的成员吗?那么我们可能会有问题,因为指向函数的指针与指向成员的指针不同。例如,请参阅此讨论:。是否可能使用make
FindLeafNode
static?thnx@Tudor作为您的精彩解释,但我认为出现错误的原因是:创建Pthread的第三个参数有问题!