如何调试这个C ++ 11线程代码?

时间:2017-04-26 09:02:11

标签: c++ c++11

我最近开始用C ++ 11编写代码。由于我理解了理论部分,我想通过编写代码进行实验。这是我在C ++中的第一个程序,它的作用是:

我正在创建一个具有线程类型成员和2个成员函数的类,其中一个是线程函数,另一个是启动此线程函数的函数。但我面临以下错误。我做了很多谷歌搜索,但没有一个帮助。我想生成2个“runThread”线程,他们将更新counter。我知道counter未同步,但一旦此错误得到解决,我将使用std::atomic变量处理此问题。

#include <iostream>
#include <stdio.h>
#include <thread>
#include <vector>

class Application {
public:
    Application(int val): counter(val) { printf("value is %d\n", counter); }
    void start();
    void print();
private:
    void runThread();
    int counter;
    std::vector<std::thread> thr;
};

void Application::runThread() {
    for(int i=0;1<50;i++)
        counter++;
}

void Application::start() {
    //std::thread t1(runThread);
    //std::thread t2(runThread);
    //this->thr.emplace_back(std::thread(&Application::runThread, this)); Tried this, but dint work
    //this->thr.emplace_back(std::thread(&Application::runThread, this));Tried this, but dint work
    thr.emplace_back(std::thread(runThread));
    thr.emplace_back(std::thread(runThread));
}

void Application::print() {
    printf("Counter = %d\n", counter);
}

int main(void)
{
    int a;
    Application app(300);
    app.start();
    std::cin >>a;
}

这是错误

../main.cpp: In member function ‘void Application::start()’:
../main.cpp:27:40: error: invalid use of non-static member function
  thr.emplace_back(std::thread(runThread));
                                        ^
../main.cpp:28:40: error: invalid use of non-static member function
  thr.emplace_back(std::thread(runThread));
                                        ^
subdir.mk:18: recipe for target 'main.o' failed
make: *** [main.o] Error 1

3 个答案:

答案 0 :(得分:2)

编译器会提示您正在使用的函数是non-static,它应该。这是因为在c ++中,即使你没有看到它,每个非静态的类成员函数都会获得一个你可能熟悉的this指针的附加参数,这个指针指向的是然后该功能进行操作。因此,您的runThread()函数实际上可以被视为runThread(Application* this),这意味着std::thread构造函数不知道您要为该参数提供什么值,并希望您提供它而是使用一个带零参数的静态成员函数。

一种解决方案是使runThread()静态并从全局变量(禁止 - 否)获取实例,或实际告诉std::thread()构造函数参数是什么

std::thread(&Application::runThread, this)

答案 1 :(得分:0)

你需要打电话,使用lambda

std::thread([this](){this->runThread();})

或绑定功能:

std::bind(&Application::runThread, this)

Running example

答案 2 :(得分:0)

runThread是一个非静态成员函数,这意味着它不能通过引用传递。相反,它必须被包裹。

替换

thr.emplace_back(std::thread(runThread));

thr.emplace_back([this]() {this->runThread();});

另请参阅:C++ Passing pointer to non-static member function