std::thread 通过bind 创建一个线程,如果线程函数里面想用类的私有成员变量,应该怎么处理

如果线程函数里面想用类的私有成员变量,可以使用std::bind函数将类的成员函数绑定到一个函数对象上,然后将该函数对象作为线程函数的参数。这样,线程函数就可以访问和修改类的私有成员变量了。

例如,下面是一个简单的例子,展示了如何在类的成员函数中使用std::thread和std::bind来访问和修改私有成员变量:

#include <iostream>
#include <thread>

class MyClass
{
public:
    void setX(int x)
    {
        this->x = x;
    }

    int getX()
    {
        return x;
    }

    void threadFunc()
    {
        std::cout << "Thread function started" << std::endl;
        std::cout << "x = " << x << std::endl;
        x++;
        std::cout << "x = " << x << std::endl;
        std::cout << "Thread function ended" << std::endl;
    }

private:
    int x;
};

int main()
{
    MyClass obj;
    obj.setX(10);

    std::thread t(&MyClass::threadFunc, &obj);
    t.join();

    std::cout << "x = " << obj.getX() << std::endl;

    return 0;
}

这个程序定义了一个名为MyClass的类,其中包含一个私有成员变量x和一个名为threadFunc()的公有成员函数。然后,我们在主函数中创建了一个名为obj的MyClass对象,并使用obj.setX(10)设置私有成员变量。接下来,我们使用std::thread t(&MyClass::threadFunc, &obj)创建了一个新线程,并将该线程与名为threadFunc()的类成员函数绑定。最后,我们使用t.join()等待线程结束,并使用obj.getX()获取私有成员变量并将其打印到控制台上。

上面 这段代码编译 报这些错误

/usr/bin/ld: /tmp/ccJTuLu3.o: in function `std::thread::thread<void (MyClass::*)(), MyClass*, void>(void (MyClass::*&&)(), MyClass*&&)':
test.cpp:(.text._ZNSt6threadC2IM7MyClassFvvEJPS1_EvEEOT_DpOT0_[_ZNSt6threadC5IM7MyClassFvvEJPS1_EvEEOT_DpOT0_]+0x37): undefined reference to `pthread_create'
collect2: error: ld returned 1 exit status

这个错误通常是由于链接器找不到pthread库而导致的。您可以在编译时使用-pthread选项来链接pthread库,例如:

g++ -std=c++11 -pthread test.cpp -o test

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值