我正在使用Xcode和C ++制作一款简单的游戏。 问题是以下代码:
#include <pthread.h>
void *draw(void *pt) {
// ...
}
void *input(void *pt) {
// ....
}
void Game::create_threads(void) {
pthread_t draw_t, input_t;
pthread_create(&draw_t, NULL, &Game::draw, NULL); // Error
pthread_create(&input_t, NULL, &Game::draw, NULL); // Error
// ...
}
但是Xcode给了我错误:“No matching function call to 'pthread_create'
”。我不知道'因为我已经包含pthread.h
。
怎么了?
谢谢!
答案 0 :(得分:8)
正如Ken所说,作为线程回调传递的函数必须是(void *)(*)(void *)类型函数。
您仍然可以将此函数作为类函数包含,但必须将其声明为static。你可能需要为每种线程类型(例如抽奖)使用不同的一种。
例如:
class Game {
protected:
void draw(void);
static void* game_draw_thread_callback(void*);
};
// and in your .cpp file...
void Game::create_threads(void) {
// pass the Game instance as the thread callback's user data
pthread_create(&draw_t, NULL, Game::game_draw_thread_callback, this);
}
static void* Game::game_draw_thread_callback(void *game_ptr) {
// I'm a C programmer, sorry for the C cast.
Game * game = (Game*)game_ptr;
// run the method that does the actual drawing,
// but now, you're in a thread!
game->draw();
}
答案 1 :(得分:1)
使用pthread编译线程是通过提供选项-pthread
完成的。
比如编译abc.cpp会要求你像g++ -pthread abc.cpp
那样进行编译
给你一个错误,如undefined reference to
pthread_create collect2:ld返回1退出状态`。必须有一些类似的方法来提供pthread选项。
答案 2 :(得分:1)
您正在传递成员函数指针(即&Game::draw
),其中需要纯函数指针。您需要使该函数成为类静态函数。
编辑添加:如果需要调用成员函数(可能),则需要创建一个类静态函数,将其参数解释为Game*
,然后在其上调用成员函数。然后,将this
作为pthread_create()
的最后一个参数传递。