【问题标题】:Compile error while execute on visual studio C++在 Visual Studio C++ 上执行时编译错误
【发布时间】:2021-08-16 06:58:42
【问题描述】:

我正在使用 Visual Studio C++ 编写代码。这是我写的示例。

我收到错误消息。有人可以指导我解决以下错误的建议

命名空间“std”没有成员“thread”

#include <iostream>
#include <cstring>
#include<thread>
#include<windows.h>
#include <vector>
#include <thread>
#include <iostream>

using namespace std;

class bar {
public:
  void foo() {
    std::cout << "hello from member function" << std::endl;
  }
};

int main()
{
  std::thread t(&bar::foo, bar());
  t.join();
}

【问题讨论】:

  • edit您的问题将fullcomplete构建输出复制粘贴到问题中。
  • 永远,绝对永远不要包含&lt;windows.h&gt;,除非您确切地知道自己在做什么。该标头正在用宏定义污染您的命名空间,这一切都搞砸了
  • 清理代码后(如删除不必要和重复的标头包含)the code builds and runs fine
  • 注意:在任何真正的程序中,在创建线程后立即join 是没有意义的。使用线程的全部意义在于让您的程序同时完成两件或多件事情。但是您的main() 例程与线程t 没有同时执行任何操作。通常你会 (1) 创建线程,(2) 暂时做些​​别的事情,然后 (3) 加入线程。

标签: c++ multithreading process


【解决方案1】:

我也觉得你想启动线程的方式不行。 必须首先构造要调用函数的对象。 该对象需要比线程的生命周期“存活”更长的时间。 您现在正在做的是尝试将 bar 类的实例作为参数传递给 foo 成员函数。

提示: 使用线程时,最好也了解 lambda。示例:

int main()
{
  bar b;
  std::thread t([b&]{b.foo()});
  t.join();
}

我经常使用 shared_ptr 将数据传递给线程。这意味着线程可以在线程的持续时间内延长对象的生命周期。对于避免传递对实际存在于堆栈中的对象的引用很有用。

int main()
{
    auto ptr = std::make_shared<bar>();
    std::thread t([ptr]{ptr->foo();}); 
    t.join();
}

【讨论】:

  • bar()创建的临时对象被移动了,保持它的存活是不必要的。不是临时对象被复制,也没有必要让它们保持活动状态
  • [b&amp;] 不会编译。
  • 您的回答没有解决原来的编译器错误。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-11-22
  • 2019-11-29
  • 2019-07-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-09
相关资源
最近更新 更多