4

我正在使用 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了。

怎么了?

谢谢!

4

3 回答 3

8

正如 Ken 所说,作为线程回调传递的函数必须是 (void*)(*)(void*) 类型的函数。

您仍然可以将此函数包含为类函数,但必须将其声明为静态。您可能需要为每种线程类型(例如draw)使用不同的线程。

例如:

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();
}
于 2012-04-30T20:14:08.433 回答
1

使用 pthread 编译线程是通过提供选项来完成的-pthread。例如编译 abc.cpp 将要求您像g++ -pthread abc.cppelse 那样编译会给您一个错误,例如undefined reference topthread_create collect2: ld returned 1 exit status` 。必须有一些类似的方式来提供 pthread 选项。

于 2012-04-30T19:27:42.090 回答
1

您正在传递一个&Game::draw需要纯函数指针的成员函数指针(即)。您需要使该函数成为类静态函数。

编辑添加:如果您需要调用成员函数(这很可能),您需要创建一个类静态函数,将其参数解释为 aGame*然后在其上调用成员函数。this然后,作为 的最后一个参数传递pthread_create()

于 2012-04-30T20:05:15.287 回答