在构造函数上启动线程时不匹配调用

时间:2015-07-27 07:15:41

标签: c++ multithreading constructor stdthread

我有class Foo,必须在构造函数上启动一个线程(我的类上的方法loop())。

我的类在头文件中是这样的:

class Foo
{
public:
  Foo();
  ~Foo();
private
  void loop();

  std::thread m_thread;

  //more stuff.
}

源文件是:

Foo::Foo()
{
   m_thread(&Foo::loop, Foo()); // <---- No match for call '(std::thread) (void (Foo::*)(), Foo)'
   m_thread.join();
}

Foo::~Foo()
{
  m_thread.kill(); // <---- ??? how to do this?
}

void Foo::loop()
{
   while()
   {
       //do stuff.
   }
}

问题:

1 - 如何修复Foo constructor上的错误?编译时我遇到"no match for call“错误。

奖金问题:

2 - 如何杀死对象析构函数上的线程?

2 个答案:

答案 0 :(得分:3)

1)你试图调用一个线程对象,而不是在这里初始化它:

     Sub CreateFiberLossReport()
    '
    ' CreateFiberFiles Macro
    '  - by Shikhar Parashar
TotalJoints = Range("F3").Value
For freqCtr = 1 To 3
freqSheet = Choose(freqCtr, "1550", "1625", "1310")
'fiberNum = "001"
    For n = 9 To 176
        For TJNum = 2 To TotalJoints + 1
            ColToSelect = Choose(TJNum, "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z")
            Sheets(freqSheet).Select
            rangeValue = ColToSelect & n

            Range(rangeValue).Select
            initPath = "C:\Users\Deepak\Desktop\Fazilka ferozpur AT\FRZ-JLB\["

            formulaValue = "=VLOOKUP(MIN(IF(ABS('" & initPath & (n / 3 - 2) & " " & freqSheet & ".xls]" & (n / 3 - 2) & " " & freqSheet & "'!$C$17:$C$28-" & ColToSelect & "5*1000)=MIN(ABS('" & initPath & (n / 3 - 2) & " " & freqSheet & ".xls]" & (n / 3 - 2) & " " & freqSheet & "'!$C$17:$C$28-" & ColToSelect & "5*1000)),IF(ABS('" & initPath & (n / 3 - 2) & " " & freqSheet & ".xls]" & (n / 3 - 2) & " " & freqSheet & "'!$C$17:$C$28-" & ColToSelect & "5*1000)< 150,'" & initPath & (n / 3 - 2) & " " & freqSheet & ".xls]" & (n / 3 - 2) & " " & freqSheet & "'!$C$17:$C$28,))),'" & initPath & (n / 3 - 2) & " " & freqSheet & ".xls]" & (n / 3 - 2) & " " & freqSheet & "'!$C$17:$E$28,3,FALSE)"
            ActiveCell.Formula = formulaValue
        Next
    Next
Next
 End Sub

您应该设置为其指定适当的值:

m_thread(&Foo::loop, Foo());

但这将默认构造另一个m_thread = std::thread(&Foo::loop, Foo()); 对象,它将启动一个线程,该线程将默认构造一个Foo对象,该对象将启动一个线程,该线程将...

所以,也许你的意思是在实例本身上启动线程,在这种情况下你需要

Foo

请注意,通常最好在构造函数初始化列表中初始化数据成员,但由于该线程调用m_thread = std::thread(&Foo::loop, this); 的成员,因此最好在对象具有该成员后启动它已经建成。

2)您可以在析构函数中加入线程。只要确保没有异常传播出析构函数。

答案 1 :(得分:1)

您还可以在构造函数初始化列表中定义m_thread对象,如:

Foo::Foo() : m_thread(&Foo::loop, this), End(false)
{
   m_thread.join();
}

结束线程的一种简单方法是使用成员变量End,在构造函数中将其设置为true并在线程中循环它

Foo::~Foo()
{
    End = true;
    m_thread.join(); // <---- ??? how to do this?
}

void Foo::loop(Foo* This)
{
   while(This->End == false)
   {
      /*Do something*/
   }
}
相关问题