0

Windows 用の単純なスレッド ライブラリを作成しています。このファンクタを渡したい

struct callable
{
    void operator()()
    {
        for(int i = 0; ;++i)
        {
            std::cout << i << std::endl;
        }
    }
};

この_beginthread()ように:

int main()
{  
    callable c;
    _beginthread(c, 0, 0);
}

しかし、それは不可能です。スレッドでファンクターを渡す機能は、私のライブラリーにとって非常に必要です。私はそれboost::threadがこの能力を提供することを知っているので、それは可能です。C++ 11スレッドを使用せずに、ファンクターをスレッド関数として使用してWindowsでスレッドを開始するにはどうすればよいですか?

[更新] C++11 スレッドを使用せずに

4

1 に答える 1

1

標準的な手法は次のとおりです。

  • スレッドに渡す必要がある情報を保持する構造体を定義します。あなたの場合、その情報は呼び出し可能なファンクターです。したがって、すでに適切な構造体が手元にあります。
  • これらの構造体の 1 つをヒープに割り当てます。これは呼び出しスレッドで発生しますが、情報は作成されたスレッドに渡されるため、スタック上に存在できません。
  • CreateThread適切なスレッド プロシージャ (詳細は後述) を渡して呼び出し、lpParameterパラメーターに構造体のアドレスを指定します。
  • スレッド プロシージャでは、構造体のアドレスが渡されlpParameterます。
  • そのポインターを適切な型にキャストし、ファンクターを呼び出します。
  • ヒープに割り当てられたメモリを削除します。

スレッド プロシージャは次のようになります。

DWORD WINAPI ThreadProc(void *lpParameter)
{
    callable *c = (callable*)lpParameter;
    (*c)();
    delete c;
    return 0;
}

への呼び出しCreateThreadは次の行に沿っています。

callable *c = new callable;
// initialise c
CreateThread(NULL, 0, ThreadProc, (void*)c, 0, &threadID);

ここに構文エラーがある場合は申し訳ありません。私は C++ にまったく堪能ではありません。

于 2013-10-29T16:17:14.933 に答える