将函数传递给新线程时编译器错误
Compiler error when passing function to new thread?
有人可以帮助我解决我在下面的main中创建线程时遇到的错误吗?
#include "lock_free_queue.h"
#include "Consumer.h"
#include <thread>
int main(){
lock_free_queue* my_queue = new lock_free_queue();
Consumer* c = new Consumer(my_queue);
//Error occurs here I think
std::thread t3(&Consumer::start);
...
t3.join();
Consumer.h(它都在标题中,因为最初打算使用模板):
#ifndef CONSUMER_H
#define CONSUMER_H
#include "lock_free_queue.h"
#include <iostream>
class Consumer{
public:
Consumer(lock_free_queue* queue) : the_queue(queue){}
void start(){
consume = true;
while(consume){
while(the_queue->getSize()==0){}
process();
}
}
我收到此错误(看起来相当可怕):
1>C:Program Files (x86)Microsoft Visual Studio 11.0VCincludefunctional(1152): error C2064: term does not evaluate to a function taking 0 arguments
1> class does not define an 'operator()' or a user defined conversion operator to a pointer-to-function or reference-to-function that takes appropriate number of arguments
1> C:Program Files (x86)Microsoft Visual Studio 11.0VCincludefunctional(1152) : while compiling class template member function 'void std::_Bind<_Forced,_Ret,_Fun,_V0_t,_V1_t,_V2_t,_V3_t,_V4_t,_V5_t,<unnamed-symbol>>::operator ()(void)'
1> with
1> [
1> _Forced=true,
1> _Ret=void,
1> _Fun=std::_Pmf_wrap<void (__cdecl Consumer::* )(void),void,Consumer,std::_Nil,std::_Nil,std::_Nil,std::_Nil,std::_Nil,std::_Nil,std::_Nil>,
1> _V0_t=std::_Nil,
1> _V1_t=std::_Nil,
1> _V2_t=std::_Nil,
1> _V3_t=std::_Nil,
1> _V4_t=std::_Nil,
1> _V5_t=std::_Nil,
1> <unnamed-symbol>=std::_Nil
1> ]
1> C:Program Files (x86)Microsoft Visual Studio 11.0VCincludethr/xthread(195) : see reference to function template instantiation 'void std::_Bind<_Forced,_Ret,_Fun,_V0_t,_V1_t,_V2_t,_V3_t,_V4_t,_V5_t,<unnamed-symbol>>::operator ()(void)' being compiled
1> with
1> [
1> _Forced=true,
1> _Ret=void,
1> _Fun=std::_Pmf_wrap<void (__cdecl Consumer::* )(void),void,Consumer,std::_Nil,std::_Nil,std::_Nil,std::_Nil,std::_Nil,std::_Nil,std::_Nil>,
1> _V0_t=std::_Nil,
1> _V1_t=std::_Nil,
1> _V2_t=std::_Nil,
1> _V3_t=std::_Nil,
1> _V4_t=std::_Nil,
1> _V5_t=std::_Nil,
1> <unnamed-symbol>=std::_Nil
1> ]
1> C:Program Files (x86)Microsoft Visual Studio 11.0VCincludethread(52) : see reference to class template instantiation 'std::_Bind<_Forced,_Ret,_Fun,_V0_t,_V1_t,_V2_t,_V3_t,_V4_t,_V5_t,<unnamed-symbol>>' being compiled
1> with
1> [
1> _Forced=true,
1> _Ret=void,
1> _Fun=std::_Pmf_wrap<void (__cdecl Consumer::* )(void),void,Consumer,std::_Nil,std::_Nil,std::_Nil,std::_Nil,std::_Nil,std::_Nil,std::_Nil>,
1> _V0_t=std::_Nil,
1> _V1_t=std::_Nil,
1> _V2_t=std::_Nil,
1> _V3_t=std::_Nil,
1> _V4_t=std::_Nil,
1> _V5_t=std::_Nil,
1> <unnamed-symbol>=std::_Nil
1> ]
1> Main.cpp(10) : see reference to function template instantiation 'std::thread::thread<void(__cdecl Consumer::* )(void)>(_Fn)' being compiled
1> with
1> [
1> _Fn=void (__cdecl Consumer::* )(void)
1> ]
Consumer::start
是一个非静态成员函数。这意味着它需要一个Consumer
实例才能对其执行操作。从形式上讲,这是通过为非静态成员函数提供隐式的第一个参数来完成的 this
。 std::thread
希望您传递一些可以用作第一个参数的参数的内容。
因此,您需要传递一个Consumer
实例或指向实例的指针,以便成员函数对其执行操作:
std::thread t3(&Consumer::start, c);
相关文章:
- 从不同线程使用int64的不同字节安全吗
- 删除一个线程上有数百万个字符串的大型哈希映射会影响另一个线程的性能
- 在C++中使用cURL和多线程
- 为什么我的C#代码在调用回C++COM直到Task时会暂停.等待/线程.加入
- 我怎么知道C++编译器是否制作线程安全的静态对象代码
- 在Windows 10上使用C 中的线程(使用G 作为编译器)的问题
- 尝试使用std ::线程时编译器错误
- 编译器优化是否解决了线程安全问题
- 可以(通过编译器)使用多少个线程来初始化全局对象(函数main之前)
- STD线程呼叫模板模板类的成员功能:编译器错误
- C++编译器中的线程
- 对于 c++11 之前的编译器,返回本地静态对象线程是否安全
- 计时器、线程和编译器不当行为
- 线程池的 lambda 函数内的编译器错误变量"未捕获"
- C++编译器:为不同线程整理的接口
- 多线程可能会抑制编译器优化
- GCC-Visual Studio std::线程编译器的差异
- 现在的C和C++编译器的线程保证是什么
- C++ 编译器如何保证常量成员变量的线程安全
- visual studio 2010 -是否有办法在旧的C/ c++编译器中使用c++ 11线程对象?