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, ¶m[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( ¶m[i] ); } #endif qint64 t = et.elapsed(); setWindowTitle( QString::number( param[3].value ) ); setWindowTitle( QString::number(t) );
pthreadで言うところの "pthread_join" が waitForFinished に相当するようです。概ね想像通りの処理時間になっているので、恐らく正しく動作しているのでしょう。