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)
哪里我做错了?
我不想声明
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)
| 归档时间: |
|
| 查看次数: |
3935 次 |
| 最近记录: |