void *
c ++および場合によってはcでもサイズが異なる可能性があるため、関数ポインターをポインターにキャストしないことを強くお勧めします。
全体として、ソリューションはあまりc++ではありません。確かに、acライブラリを使用すると少し注意が必要になります。現在のプロジェクトで使用している方法は次のとおりです。-
class ThreadBase
{
public:
ThreadBase ()
{
}
virtual ~ThreadBase ()
{
// TODO - inform thread to stop, using a message or a signal or something
// and then wait for the thread to terminate
void
*return_value = 0;
pthread_join (m_thread_handle, &return_value);
}
void Run ()
{
if (pthread_create (&m_thread_handle, 0, ThreadFunction, this))
{
// error - throw an exception or something
}
}
private:
static void *ThreadFunction (void *param)
{
ThreadBase
*thread = static_cast <ThreadBase *> (param);
thread->Main ();
return 0;
}
virtual void Main () = 0;
private:
pthread_t
m_thread_handle;
};
次に、ThreadBaseから実装固有のバージョンを派生させます。
class SomeThread : public ThreadBase
{
private:
void Main ()
{
// do something
}
};
Main
終了コードを返し、それをスレッドから返すように変更することもできます。Main
そして、それが無限ループにある場合(たとえば、ある種のメッセージを消費するリスナーである場合)に終了する方法が必要です。