Cxw1234a 2023-02-17 14:30 采纳率: 42.9%
浏览 24
已结题

c++多线程编程,如何同时读取和修改对象的成员变量

怎么创建两个线程,一个通过p1使用get()读取值,一个使用p2通过set()修改值


#include<memory>
#include<thread>
#include<mutex>
#include<iostream>

using namespace std;

class A{
private:
    int x;

public:
    A(int _x):x(_x) {};

    int get()
    {
        return x;
    }

    void set(int y)
    {
        x = y;
        return;
    }
};



int main()
{
    shared_ptr p1 = make_shared(new A(1));
    shared_ptr p2(p1);
}

3条回答 默认 最新

  • zmy1127 2023-02-17 15:30
    关注

    可以使用std::thread和std::mutex来创建两个线程,一个用于读取值,一个用于修改值。具体实现如下

    
    #include <memory>
    #include <thread>
    #include <mutex>
    #include <iostream>
     
    using namespace std;
     
    class A {
    private:
        int x;
        mutex m;
     
    public:
        A(int _x) : x(_x) {};
     
        int get() {
            lock_guard<mutex> lock(m);
            return x;
        }
     
        void set(int y) {
            lock_guard<mutex> lock(m);
            x = y;
        }
    };
     
    int main() {
        shared_ptr<A> p1 = make_shared<A>(1);
        shared_ptr<A> p2(p1);
     
        // 线程1:通过p1使用get()读取值
        thread t1([&](){
            while (true) {
                int x = p1->get();
                cout << "Thread 1 read value: " << x << endl;
            }
        });
     
        // 线程2:使用p2通过set()修改值
        thread t2([&](){
            int x = 0;
            while (true) {
                p2->set(x++);
                cout << "Thread 2 set value: " << x << endl;
            }
        });
     
        t1.join();
        t2.join();
     
        return 0;
    }
    
    

    在A类中使用了一个互斥锁std::mutex来保护共享资源x,防止多个线程同时访问和修改造成数据竞争问题。线程1通过p1调用get()方法读取值,线程2通过p2调用set()方法修改值。在main()函数中创建了两个线程t1和t2,分别运行读取和修改操作,通过调用join()等待线程结束。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(2条)

报告相同问题?

问题事件

  • 系统已结题 3月14日
  • 已采纳回答 3月6日
  • 创建了问题 2月17日

悬赏问题

  • ¥15 echarts动画效果失效的问题。官网下载的例子。
  • ¥60 许可证msc licensing软件报错显示已有相同版本软件,但是下一步显示无法读取日志目录。
  • ¥15 Attention is all you need 的代码运行
  • ¥15 一个服务器已经有一个系统了如果用usb再装一个系统,原来的系统会被覆盖掉吗
  • ¥15 使用esm_msa1_t12_100M_UR50S蛋白质语言模型进行零样本预测时,终端显示出了sequence handled的进度条,但是并不出结果就自动终止回到命令提示行了是怎么回事:
  • ¥15 前置放大电路与功率放大电路相连放大倍数出现问题
  • ¥30 关于<main>标签页面跳转的问题
  • ¥80 部署运行web自动化项目
  • ¥15 腾讯云如何建立同一个项目中物模型之间的联系
  • ¥30 VMware 云桌面水印如何添加