解决多线程使用全局变量时需要不断加锁和解锁的问题

您所在的位置:网站首页 两个线程共用一个变量怎么办 解决多线程使用全局变量时需要不断加锁和解锁的问题

解决多线程使用全局变量时需要不断加锁和解锁的问题

2024-06-14 10:27| 来源: 网络整理| 查看: 265

在多线程编程中,如果多个线程都需要对同一个全局变量进行赋值或者读取操作,那么在每次赋值或读取时,为了确保线程安全,都必须要进行加锁和解锁的操作,这样会在编程时带来很多麻烦。特别是线程多、全局变量多的时候,需要不断地加锁和解锁。

传统的全局变量使用方法如下:

global_variables.h:

// 1.无人机 extern Drone g_drone; extern std::mutex drone_mutex; // 2.无人车 extern Vehicle g_vehicle; extern std::mutex vehicle_mutex; // 3.终端 extern Pad g_pad; extern std::mutex pad_mutex;

global_variables.cc:

// 1.无人机 Drone g_drone = Drone(); std::mutex drone_mutex; // 2.无人车 Vehicle g_vehicle = Vehicle(); std::mutex vehicle_mutex; // 3.终端 Pad g_pad = Pad(); std::mutex pad_mutex;

在需要用到全局变量的程序中,include该global_variables.h头文件后,直接操作g_变量即可。但是每一处需要用到全局变量的地方,都需要对互斥体进行加锁和解锁。

为了解决这个问题,可以定义一个全局变量类(该类):首先将每个全局变量作为私有成员统一放入该类中,然后在类里为每一个全局变量定义一把线程锁,最后提供一个外部可以访问的set(赋值)和get(读取)函数接口,在set和get函数中,进行加锁和解锁。

class GlobalVariables { public: // 1.成员函数 // 1.1构造与析构函数 GlobalVariables(); // 1.2成员变量设置函数 void set_drone(Drone drone) { std::lock_guard drone_mutex_; g_drone_ = drone; } void set_vehicle(Vehicle vehicle) { std::lock_guard vehicle_mutex_; g_vehicle_ = vehicle; } void set_pad(Pad pad) { std::lock_guard pad_mutex_; g_pad_ = pad; } // 1.3成员变量获取函数 Drone get_drone() { std::lock_guard drone_mutex_; return g_drone_; } Vehicle get_vehicle() { std::lock_guard vehicle_mutex_; return g_vehicle_; } Drone get_pad() { std::lock_guard pad_mutex_; return g_pad_; } // 1.4功能函数 private: // 1.成员函数 // 2.成员变量 Drone g_drone_; std::mutex drone_mutex_; Vehicle g_vehicle_; std::mutex vehicle_mutex_; Pad g_pad_; std::mutex pad_mutex_; };

但是这样的问题是,对全局变量进行局部修改时(比如改变g_drone_对象中的一小部分)不太方便。因为只提供了整体set和get的接口。



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3