0

スレッド化プログラムに問題があります。問題が何であるかはわかっていますが、それを修正する方法がわかりません。マンデルブロー セットを作成し、それを ppm ファイルに書き出すために、任意の数のスレッドを設定しています。私は std::thread のベクトルを使用しており、マンデルブロ クラス メンバー関数を呼び出してスレッド化を行っています。ここで問題が発生します。コンパイラが気に入らない void(void) 関数を呼び出しています。スレッドが void(void) 関数を実行するようにこれを修正するにはどうすればよいですか? 私のコードは以下の通りです:

main.cpp

int main(int argc, char **argv) {
   const unsigned int WIDTH = 1366;
   const unsigned int HEIGHT = 768;
   int numThreads = 2;

   Mandelbrot mandelbrot(WIDTH, HEIGHT);

   if(argc > 1) {
      numThreads = atoi(argv[1]);
   }

   std::vector<std::thread> threads;

   for(int i = 0; i < numThreads; ++i) {
      threads.emplace_back(mandelbrot.mandelbrotsetThreaded());
   }

   for(int i = 0; i < numThreads; ++i) {
      threads[i].join();
   }

   return 0;
}

mandelbrot.cpp

void Mandelbrot::mandelbrotsetThreaded() {
   while(true) {
      int row = 0;
      {
         std::lock_guard<std::mutex> lock(row_mutex);
         row = cur_row++;
      }
      if(row == width) return;
      createMandelbrotSet(row);
   }
}
4

1 に答える 1

5
threads.emplace_back(mandelbrot.mandelbrotsetThreaded());
//                                                   ^^
//                                               note this!

その小さな行は実際にを呼び出し mandelbrot.mandelbrotsetThreaded()、戻り値を使用して に渡そうとしthreads.emplace_back()ます。戻り値の型が次のように指定されている場合、これはかなり難しいことがわかりますvoid:-)

必要なのは、次のような関数の結果ではなく、関数 (アドレス) 自体です。

threads.emplace_back(mandelbrot.mandelbrotsetThreaded);
于 2014-01-25T04:47:11.633 に答える