ale*_*ark -4 c++ multithreading c++11
我知道这个话题被问了很多次,但我不明白我的代码中的错误在哪里。
\n\n我有一个 foo.h 文件,我在其中定义了:
\n\nclass Foo {\n public:\n Foo();\n ~Foo();\n void DoSomething(cv::Mat& img);\n void DoSomethingAsync(cv::Mat& img);\n\n private:\n bool isFinished = false;\n};\nRun Code Online (Sandbox Code Playgroud)\n\n然后是这样的 foo.cpp:
\n\nFoo:Foo() {}\n\nFoo:~Foo() {}\n\nvoid Foo::DoSomethingAsync(cv::Mat& img) {\ntry {\n IsFinished = true;\n} catch(exception& e) {\n} \n\nvoid Foo::DoSomething(cv::Mat& img) {\n thread_mutex.lock();\n thread_async = std::move(std::thread(&Foo::DoSomethingAsync, this, img));\nthread_mutex.unlock();\n}\nRun Code Online (Sandbox Code Playgroud)\n\n从我的 main.cpp 文件中,我调用该函数:
\n\nFoo foo;\nfoo.DoSomething(im);\nRun Code Online (Sandbox Code Playgroud)\n\n当我编译时,我总是收到此错误:
\n\nerror: no type named \xe2\x80\x98type\xe2\x80\x99 in \xe2\x80\x98class std::result_of<std::_Mem_fn<void (ObjectDetector::*)(cv::Mat&)>(ObjectDetector*, cv::Mat)>\xe2\x80\x99\n typedef typename result_of<_Callable(_Args...)>::type result_type;\n ^\n/usr/include/c++/5/functional:1526:9: error: no type named \xe2\x80\x98type\xe2\x80\x99 in \xe2\x80\x98class std::result_of<std::_Mem_fn<void (ObjectDetector::*)(cv::Mat&)>(ObjectDetector*, cv::Mat)>\xe2\x80\x99\n _M_invoke(_Index_tuple<_Indices...>)\nRun Code Online (Sandbox Code Playgroud)\n\n你能解释一下为什么吗?
\n\n在我的 CMake 中,我使用 -pthread 设置变量 CMAKE_CXX_FLAGS
\n尽管您仍未能提供 MCVE,但我还是设法破译了您的问题。您需要std::ref在通过时使用img:
std::thread(&Foo::DoSomethingAsync, this, std::ref(img));
Run Code Online (Sandbox Code Playgroud)
std::thread::thread当您阅读的文档时,推理就会变得显而易见- 您应该在在 StackOverflow 上发布之前完成此操作。
3) 创建新
std::thread对象并将其与执行线程关联。新的执行线程开始执行Run Code Online (Sandbox Code Playgroud)std::invoke(decay_copy(std::forward<Function>(f)), decay_copy(std::forward<Args>(args))...);
wandbox 上的实时示例 (请自己创建一个来演示将来的错误!)
还:
您正在使用std::movervalue 。这是错误的,因为它是不必要的并且会阻止复制省略。
只需使用lambda 表达式来初始化您的std::thread- 它将更易于阅读并且具有更少的令人惊讶的行为。
| 归档时间: |
|
| 查看次数: |
8831 次 |
| 最近记录: |