无法在pthread_create函数中将'*void(MyClass ::*)(void*)转换为void*(*)(void*)

Gab*_*tto 5 c++ pthreads friend friend-function

我正在尝试使用类"CameraManager"创建一个新线程,但我有以下错误:

无法在pthread_create函数中将'*void(CameraManager ::*)(void*)转换为void*(*)(void*)

我在cameramanager.h文件中定义:

public:
void *dequeueLoop(void *ptr);
Run Code Online (Sandbox Code Playgroud)

并在cameramanager.cpp

void CameraManager::startDequeuing(){
dequeuing = true;
dequeueThreadId = pthread_create(&dequeueThread, NULL, &CameraManager::dequeueLoop, NULL);
}

void *CameraManager::dequeueLoop(void *ptr){
while(dequeuing){
    highSpeedCamera->dequeue();
    highSpeedCamera->enqueue();
}
Run Code Online (Sandbox Code Playgroud)

我不想将dequeueLoop声明为静态函数我也尝试以下列方式将dequeueLoop声明为类友元函数但是它没有类变量'highSpeedCamera'和'dequeuing'的范围,编译器也告诉我我认为'dequeueLoop'未在此范围内声明

使dequeueLoop成为朋友的功能我做了:

cameramanager.h

public:
friend void *dequeueLoop(void *ptr);
Run Code Online (Sandbox Code Playgroud)

cameramanager.cpp

void CameraManager::startDequeuing(){
    dequeuing = true;
    dequeueThreadId = pthread_create(&dequeueThread, NULL, &CameraManager::dequeueLoop, NULL);
}
void *dequeueLoop(void *ptr){
    while(dequeuing){
        highSpeedCamera->dequeue();
        highSpeedCamera->enqueue();
    }
}
Run Code Online (Sandbox Code Playgroud)

哪里我做错了?

Mik*_*our 7

我不想声明dequeueLoop为静态函数

如果你想使用pthreads,那么你需要一个入口点的静态或非成员函数.您可以将指向对象的指针传递给此函数,将其用作非静态成员函数的蹦床:

static void * dequeueEntry(void * self) {
    return static_cast<CameraManager*>(self)->dequeueLoop();
}

dequeueThreadId = pthread_create(
    &dequeueThread, NULL, 
    &CameraManager::dequeueEntry, // <-- pointer to trampoline function
    this);                        // <-- pointer to object for member function
Run Code Online (Sandbox Code Playgroud)

或者,如果您有一个现代编译器,您可以使用标准线程库:

std::thread thread(&CameraManager::dequeLoop, this);
Run Code Online (Sandbox Code Playgroud)

  • 如果你没有现代编译器,你可以考虑使用boost :: thread - 它将是一个很好的语法 (3认同)