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

要在 std::thread 中绑定成员函数,需要使用 std::bind 或者 lambda 表达式来创建一个可以调用的对象。 使用 std::bind 实现绑定成员函数的示例如下: ```cpp #include <iostream> #include <thread> #include <functional> class MyClass { public: void memberFunction(int value) { std::cout << "Member function called with value: " << value << std::endl; } }; int main() { MyClass obj; int value = 42; // 使用 std::bind 绑定成员函数和对象 std::thread myThread(std::bind(&MyClass::memberFunction, &obj, value)); // 等待线程执行完毕 myThread.join(); return 0; } ``` 在上述示例中,我们首先创建了一个 MyClass ,并在其中定义了一个成员函数 memberFunction。然后,在 main 函数中,我们创建了一个 MyClass 对象 obj 和一个值 value。接下来,使用 std::bind 将成员函数 memberFunction 绑定到 obj 上,并将 value 作为参数传递给成员函数。 最后,我们将绑定后的可调用对象传递给 std::thread 构造函数创建线程对象 myThread,并使用 join() 等待线程执行完毕。 除了使用 std::bind,你还可以使用 lambda 表达式来绑定成员函数。以下是使用 lambda 表达式的示例: ```cpp #include <iostream> #include <thread> class MyClass { public: void memberFunction(int value) { std::cout << "Member function called with value: " << value << std::endl; } }; int main() { MyClass obj; int value = 42; // 使用 lambda 表达式绑定成员函数和对象 std::thread myThread([&]() { obj.memberFunction(value); }); // 等待线程执行完毕 myThread.join(); return 0; } ``` 在上述示例中,我们定义了一个 lambda 表达式,其中调用了成员函数 memberFunction,并传递了 value。然后,将 lambda 表达式传递给 std::thread 构造函数创建线程对象 myThread,并使用 join() 等待线程执行完毕。 无论是使用 std::bind 还是 lambda 表达式,都可以实现将成员函数绑定到 std::thread 中进行调用。选择使用哪种方式取决于个人偏好和特定的需求。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值