2016-09-23 67 views
1

我试图在多线程中从名为SVAnchor的类运行名为extensionStep的函数。我用这个代码:如何使用pthreads对类成员函数进行多线程处理?

rc = pthread_create(&threads[i], NULL, extensionStep, &td[i]); 

调用的函数,在这里是extensionStep定义:

void* SVAnchor::extensionStep(void *threadarg) 

,我得到了以下错误:

error: cannot convert 'SVAnchor::extensionStep' from type 'void* (SVAnchor::)(void*)' to type 'void* (*)(void*)' 
      rc = pthread_create(&threads[i], NULL, extensionStep, &td[i]); 
                    ^

,显示问题从类型'void *(SVAnchor ::)(void *)'转换为类型'void *()(void)'

How解决这个问题?

感谢所有

+2

你应该考虑的std ::线程(如果C++ 11) –

+0

@DieterLücking你的意思是pthreads不支持这件事?对我来说真的很贵,去std :: thread – ameerosein

+0

@ameerosein试着做rc = pthread_create(&threads [i],NULL,&(SVAnchor :: extensionStep),&td [i]); – user3286661

回答

1

这应该做的工作:(使功能extensionStep静态后)

rc = pthread_create(&threads[i], NULL, &(SVAnchor::extensionStep), &td[i]); 

或者你可以创建一个包装函数这样的:

struct Argument { 
    SVAnchor* ptr; 
    int* tid; 
} 

static void *extensionStepWrapper(void *arg) 
{ 
    return (((Argument*)arg)->ptr)->extensionStep(((Argument*)arg)->tid); 
} 

而且使用包装:

Argument arg; 
arg.ptr = &(class_variable_name); // Use appropriate name (whatever you variable name is for the object of the class SVAnchor) 
arg.tid = &(td[i]); 

rc = pthread_create(&threads[i], NULL, &(SVAnchor::extensionStepWrapper), &arg); 

需要注意的是,如果你从内部的其他部件的功能调用这个,你可以这样做,而不是:

arg.ptr = this; 

您也可以在类中创建一个方法来启动线程:

bool StartThread(int* tid){ 
     return (pthread_create(&_thread, NULL, extensionStep, tid) == 0); 
} 

您可能还需要将该线程作为StartThread()函数的参数传递。

+0

@PaulRooney我在另一个类的成员函数里面使用函数,所以没有class_variable_name!我该怎么办? – ameerosein

+0

如果它的内部SVAnchor那么它会是'this' – PaulHK

+0

@ameerosein使用'arg。ptr = this;'在这种情况下。 – user3286661

1

这是一个类的成员函数的C-回调的一个共同的映射:

#include <iostream> 
#include <pthread.h> 

class Task 
{ 
    public: 
    Task() : thread_id(0) {} 

    bool start() { 
     // Passing this as user data to the C-callback. 
     return pthread_create(&thread_id, 0, invoke, this) == 0; 
    } 

    void stop() { 
     void* no_result; 
     pthread_join(thread_id, &no_result); 
    } 

    private: 
    Task(const Task&); // no copy (C++11 delete) 
    Task& operator = (const Task&); // no copy (C++11 delete) 

    void process() { 
     std::cout << "Hello\n"; 
    } 

    // The C-callback has to be static. 
    static void* invoke(void* self) { 
     // Note: The invocation takes place in start (passing this) 
     static_cast<Task*>(self)->process(); 
     // No result passed to join. 
     return 0; 
    } 

    pthread_t thread_id; 
}; 

int main() { 
    Task task; 
    task.start(); 
    task.stop(); 
} 

这是一个C++ 11版:

#include <iostream> 
#include <thread> 

class Task 
{ 
    public: 
    void operator()() { 
     std::cout << "Hello\n"; 
    } 
}; 

int main() { 
    Task task; 
    std::thread thread(task); 
    thread.join(); 
} 
相关问题