上記の答えは良いですが、私の場合、関数を静的に変換する最初のアプローチは機能しませんでした。既存のコードを変換してスレッド関数に移動しようとしていましたが、そのコードにはすでに非静的クラス メンバーへの参照がたくさんありました。C++ オブジェクトにカプセル化する 2 番目のソリューションは機能しますが、スレッドを実行するための 3 レベルのラッパーがあります。
私は、既存の C++ 構造体である「friend」関数を使用する代替ソリューションを用意しましたが、それは私の場合には完璧に機能しました。「friend」の使用例 (friend を使用してコンパクトな形式に変換する方法を示す名前には、上記と同じ例を使用します)
class MyThreadClass
{
public:
MyThreadClass() {/* empty */}
virtual ~MyThreadClass() {/* empty */}
bool Init()
{
return (pthread_create(&_thread, NULL, &ThreadEntryFunc, this) == 0);
}
/** Will not return until the internal thread has exited. */
void WaitForThreadToExit()
{
(void) pthread_join(_thread, NULL);
}
private:
//our friend function that runs the thread task
friend void* ThreadEntryFunc(void *);
pthread_t _thread;
};
//friend is defined outside of class and without any qualifiers
void* ThreadEntryFunc(void *obj_param) {
MyThreadClass *thr = ((MyThreadClass *)obj_param);
//access all the members using thr->
return NULL;
}
もちろん、boost::thread を使用してこれらすべてを回避することもできますが、C++ コードを変更して、boost を使用しないようにしようとしていました (コードは、この目的のためだけに boost に対してリンクしていました)。