当前位置: 代码迷 >> 综合 >> c++下使用读写锁控制多线程使用统一私有变量
  详细解决方案

c++下使用读写锁控制多线程使用统一私有变量

热度:53   发布时间:2024-03-07 10:28:07.0

今天在一个类A中定义了私有变量member,然后定义了read和write方法用于读取该变量和设置该变量。但是在使用时是在类B中定义了一个A的对象a,然后在a中启动了一个线程t1,在t1中调用a.write(),又启动了一个线程t2,在其中调用了a.read();这样算上主线程,总共3个线程,里面对私有变量menber进行了同时读写。在运行过程中,报2个错:

free(): corrupted unsorted chunks

corrupted size vs. prev_size 内存溢出

后面分析是因为read和write方法中都是用了while(1)进行频繁读写,可能造成了对member的读写抢占,造成出错。后面使用了读写锁解决了上述问题。

1. 引入头文件

#include <pthread.h>

2. 在A类的.h中定义读写锁

pthread_rwlock_t rw_lock;

3. 在对读写共用的变量赋值前后加锁、解锁

加写锁:

pthread_rwlock_wrlock(&rw_lock);//加锁aImageAddParam.time = tv.tv_sec * 1000000 + tv.tv_usec;if (len > 0){XXXX//vecImageParameter为共享的变量vecImageParameter.push_back(aImageAddParam);//  std::cout << "vecImageParameter size is "<<vecImageParameter.size()<<std::endl;if (vecImageParameter.size() > vecSize){vecImageParameter.erase(vecImageParameter.begin());}XXXXX}pthread_rwlock_unlock(&rw_lock);//释放锁

加读锁:

 void getVecParameters(std::vector<struct ImageAdditionalParameters> &param){pthread_rwlock_rdlock(&rw_lock);//读锁param = vecImageParameter;pthread_rwlock_unlock(&rw_lock);//释放锁}

4. 修改cmakelist.txt

增加pthread到target_link_libraries段中
 


if(CMAKE_COMPILER_IS_GNUCXX OR CMAKE_CXX_COMPILER_ID MATCHES "Clang")add_compile_options(-Wall -Wextra -Wpedantic -pthread -lboost_filesystem)endif()##message(MICROS_VERSION: ${MICROS_VERSION})if(COMPILER_SUPPORTS_CXX11)set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11 -pthread")elseif(COMPILER_SUPPORTS_CXX0X)set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++0x")else()message(STATUS "The compiler ${CMAKE_CXX_COMPILER} has no C++11 support. Please use a different C++ compiler.")endif()target_link_libraries(micros_scene_3light_ranging optimizedgimbal_ctrlpthread)

 

  相关解决方案