首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >C++ std:线程无效使用void表达式

C++ std:线程无效使用void表达式
EN

Stack Overflow用户
提问于 2014-01-24 20:38:17
回答 1查看 3.5K关注 0票数 0

我的线程程序有问题。我知道问题是什么,我只是不知道怎么解决。我正在设置任意数量的线程,以创建mandelbrot集,然后将其写入ppm文件。我使用std::线程的向量,并调用Mandelbrot类成员函数来执行线程处理。问题就发生在这里。我正在调用一个void(void)函数,其中编译器不喜欢它。如何解决这个问题,以便线程执行void(void)函数?我的代码如下:

main.cpp

代码语言:javascript
运行
AI代码解释
复制
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

代码语言:javascript
运行
AI代码解释
复制
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);
   }
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-01-24 20:47:11

代码语言:javascript
运行
AI代码解释
复制
threads.emplace_back(mandelbrot.mandelbrotsetThreaded());
//                                                   ^^
//                                               note this!

这一行代码实际上将调用mandelbrot.mandelbrotsetThreaded(),并尝试使用返回值传递给threads.emplace_back()。当返回类型指定为void :-)时,它会发现这非常困难。)

您想要的是函数(地址)本身,而不是函数的结果,类似于:

代码语言:javascript
运行
AI代码解释
复制
threads.emplace_back(mandelbrot.mandelbrotsetThreaded);
票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21346701

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档