pthreadの代わりに、QtConcurrentRunを使う

pthreadを使う方法が分からなかったんですが、「QtConcurrentを使うと良い」というアドバイスを頂いたので、試してみました(実戦投入はまだです)。Debugモードじゃないと最適化されて一瞬で終わる模様。

#include <QtConcurrentRun>
#include <QElapsedTimer>

struct TParam
{
  int threadIndex;
  int value;
};

// テストしたマシンでは、約1000ms
void thread_func( TParam* param )
{
  int sum = 0;
  for (int i=0; i<10000000; i++)
  {
    for (int j=0; j<45; j++) sum += 1;
  }
  param->value = param->threadIndex;
  param->value += sum;
}

スレッド処理したい関数と、関数に渡したいパラメータを定義します。

    QElapsedTimer et;
    et.start();

    // 最大スレッド数
    const int threadNum = 16;
    TParam param[threadNum];
    for (int i=0; i<threadNum; i++)
    {
      param[i].threadIndex = i;
      param[i].value = 0;
    }

#if 1
    // 1〜4、どれにしても同じ時間かかる (8だと2倍、12だと3倍 (4スレッドマシンなので))
    const int processNum = 4;

    QFuture<void> future[threadNum];
    for (int i=0; i<processNum; i++)
    {
      future[i] = QtConcurrent::run( &thread_func, &param[i] );
    }
    for (int i=0; i<processNum; i++)
    {
      future[i].waitForFinished();
    }
#else
    // 4倍処理に時間がかかる
    const int processNum = 4;

    for (int i=0; i<processNum; i++)
    {
      thread_func( &param[i] );
    }
#endif

    qint64 t = et.elapsed();
    setWindowTitle( QString::number( param[3].value ) );
    setWindowTitle( QString::number(t) );

pthreadで言うところの "pthread_join" が waitForFinished に相当するようです。概ね想像通りの処理時間になっているので、恐らく正しく動作しているのでしょう。