使用named_mutex实现锁机制

15 篇文章 0 订阅
13 篇文章 0 订阅

介绍

  • named_mutex是一个进程锁,考虑到进程和线程之间的区别
  • 区别:一个工作单元要想被称作进程,它必须要有操作系统指派给他的地址空间,必须拥有进程ID,必须拥有状态和进程表中的表项。进程和线程之间最大的区别是进程有着自己的地址空间,而线程共享创建它们的进程的地址空间。
  • 本例子是使用多线程的方式来测进程锁的线程安全
  • 等一切结束的时候,好好总结一下,完善这个大坑

代码

#include <boost/thread/thread.hpp>
#include <boost/interprocess/sync/scoped_lock.hpp>
#include <boost/interprocess/sync/named_mutex.hpp>
#include <boost/ref.hpp>

#include <string>
#include <mutex>

//boost::shared_mutex global_mutex;
int global_num = 10;//全局变量,写者改变全局变量,读者读全局变量
namespace bip = boost::interprocess;
bip::named_mutex global_mutex(bip::open_or_create,"mtx");

//读线程
void read_thread(std::string &name){
    boost::lock_guard<bip::named_mutex> lock(global_mutex);//读锁定
//    bip::named_mutex global_mutex(bip::open_or_create,"mtx");
//    global_mutex.lock();
    printf("线程%s抢占了资源,global_num = %d\n",name.c_str(),global_num);
    boost::this_thread::sleep(boost::posix_time::seconds(1));
    printf("线程%s释放了资源...\n",name.c_str());
//    global_mutex.unlock();
}

//写线程
void write_thread(std::string &name){
    std::lock_guard<bip::named_mutex> lock(global_mutex);//写锁定
//    bip::named_mutex global_mutex(bip::open_or_create,"mtx");
//    global_mutex.lock();
    global_num++;//写线程改变数据的数值
    printf("线程%s抢占了资源,global_num = %d\n",name.c_str(),global_num);
    boost::this_thread::sleep(boost::posix_time::seconds(1));
    printf("线程%s释放了资源...\n",name.c_str());
//    global_mutex.unlock();
}

int main(){
    std::string read_thread_r1 = "read_thread_r1";
    std::string read_thread_r2 = "read_thread_r2";
    std::string read_thread_r3 = "read_thread_r3";
    std::string read_thread_r4 = "read_thread_r4";
    std::string read_thread_r5 = "read_thread_r5";
    std::string write_thread_w1 = "write_thread_w1";
    std::string write_thread_w2 = "write_thread_w2";

    boost::thread_group tg;
    tg.create_thread(boost::bind(read_thread,boost::ref(read_thread_r1)));
    tg.create_thread(boost::bind(read_thread,boost::ref(read_thread_r2)));
    tg.create_thread(boost::bind(read_thread,boost::ref(read_thread_r3)));
    tg.create_thread(boost::bind(read_thread,boost::ref(read_thread_r4)));
    tg.create_thread(boost::bind(read_thread,boost::ref(read_thread_r5)));
    tg.create_thread(boost::bind(write_thread,boost::ref(write_thread_w1)));
    tg.create_thread(boost::bind(write_thread,boost::ref(write_thread_w2)));
    tg.join_all();

    return 0;
}

参考链接

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值