c++11线程类如何使用类成员函数

12 浏览
0 Comments

c++11线程类如何使用类成员函数

我的程序如下所示:

#include 
#include 
class A {
public:
    void foo(int n ) { std::cout << n << std::endl; }
};
int main()
{
    A a;
    std::thread t1(&A::foo, std::ref(a), 100);
    t1.join();
    return 0;
}

当我使用以下命令编译它时,我得到了错误:

g++ -o main main.cc -lpthread -std=c++11

错误信息:

在文件/usr/local/include/c++/4.8.2/thread中包含自/usr/local/include/c++/4.8.2/functional:1697:61,
从check.cc:2中包含自/usr/local/include/c++/4.8.2/thread:39:0,
在‘std::_Bind_simple(std::reference_wrapper, int)>’的实例化中:
/usr/local/include/c++/4.8.2/functional:1697:61: 错误:类‘std::result_of(std::reference_wrapper, int)>’中没有名为‘type’的类型
        typedef typename result_of<_Callable(_Args...)>::type result_type;
                                                              ^
/usr/local/include/c++/4.8.2/functional:1727:9: 错误:类‘std::result_of(std::reference_wrapper, int)>’中没有名为‘type’的类型
          _M_invoke(_Index_tuple<_Indices...>)

0
0 Comments

问题的出现原因是希望在C++11中使用线程类来调用一个类成员函数。解决方法是使用lambda表达式来构造线程,通过调用成员函数或绑定参数来实现。

 std::thread t1([&] { a.foo(100); });

这种方法更加简洁,不需要将参数、对象甚至函数暴露给线程,只需给线程提供它所需要的东西,即一个void (*)(void)函数指针(这是最简单的描述方式)。

0
0 Comments

C++11中的Thread类是用来创建线程的,它的构造函数可以接受一个可调用对象作为参数,然后在新的线程中执行该对象。

在该问题中,有人尝试使用Thread类来调用一个类的成员函数,但是在使用GCC 4.8编译时出现了错误。这个错误在GCC 4.7、GCC 4.6、clang r198621和MSVC2013中都能够正确编译。

经过分析,发现这是GCC 4.8中标准库的一个bug。根据C++11标准的规定,Thread类的构造函数应该执行INVOKE函数,而INVOKE函数的实现中有一个DECAY_COPY的操作,该操作会将传入的参数复制到新线程的环境中。在这个问题中,所有的参数都是右值,因此DECAY_COPY会复制这些参数,并在新线程中执行。

在问题中的代码中,Thread类的构造函数的第一个参数是一个指向类成员函数的指针,第二个参数是一个类的引用,第三个参数是一个整数。根据C++11标准的规定,指向类成员函数的指针可以通过对象指针或引用来调用,因此这里的调用是合法的。所以,根据标准的规定,代码的行为是符合预期的。

但是,GCC 4.8中的标准库实现存在一个bug,导致在这种情况下编译错误。这个bug不在GCC 4.7、GCC 4.6、clang r198621和MSVC2013中存在。

,这个问题的出现是因为GCC 4.8中Thread类的标准库实现的bug。解决方法是使用其他编译器或者更新GCC版本。

0
0 Comments

问题的出现原因是在使用C++11中的Thread类时,如果要调用一个类的成员函数,需要使用成员函数的指针作为参数。然而,如果直接将类的成员函数作为参数传递给std::thread构造函数,会导致编译错误。

解决方法是使用指向类的指针来调用成员函数。在上述代码示例中,使用了指向类A对象a的指针&a,并将成员函数foo的指针传递给std::thread构造函数。这样就可以正确地调用类的成员函数。

以下是整理后的文章:

在使用C++11中的Thread类时,如果要调用一个类的成员函数,需要使用成员函数的指针作为参数。然而,直接将类的成员函数作为参数传递给std::thread构造函数会导致编译错误。

为了解决这个问题,可以使用指向类的指针来调用成员函数。例如,可以使用以下代码来正确地调用类A中的成员函数foo:

std::thread t1(&A::foo, &a, 100);

在上述代码中,首先传递了指向类A对象a的指针&a作为std::thread构造函数的第二个参数。然后,将成员函数foo的指针作为第一个参数传递给std::thread构造函数。这样就可以正确地调用类的成员函数。

通过使用指向类的指针来调用成员函数,可以避免编译错误,并正确地使用C++11中的Thread类调用类的成员函数。这种方法简单而有效,可以帮助开发人员更好地使用C++11中的Thread类。

0