博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
boost库中thread多线程详解2——mutex与lock
阅读量:4191 次
发布时间:2019-05-26

本文共 2792 字,大约阅读时间需要 9 分钟。

1. mutex对象类

mutex类主要有两种:独占式与共享式的互斥量。

▲ 独占式互斥量:
mutex: 独占式的互斥量,是最简单最常用的一种互斥量类型
try_mutex: 它是mutex的同义词,为了与兼容以前的版本而提供
timed_mutex: 它也是独占式的互斥量,但提供超时锁定功能
▲ 递归式互斥量:
recursive_mutex: 递归式互斥量,可以多次锁定,相应地也要多次解锁
recursive_try_mutex: 它是recursive_mutex 的同义词,为了与兼容以前的版本而提供
recursive_timed_mutex: 它也是递归式互斥量,基本功能同recursive_mutex, 但提供超时锁定功能
▲ 共享式互斥量:
shared_mutex: multiple-reader/single-writer 型的共享互斥量(又称读写锁)。
其中mutex有lock和unlock方法,shared_mutex除了提供lock和unlock方法外,还有shared_lock和shared_unlock方法。

2. lock模板类

▲ 独占锁:

boost::unique_lock<T>,其中T可以mutex中的任意一种。
  如果T为mutex,那么boost::unique_lock<boost::mutex>,构造与析构时则分别自动调用lock和unlock方法。
  如果T为shared_mutex,那么boost::unique_lock<boost::shared_mutex>,构造与析构时则分别调用shared_mutex的shared_lock和shared_unlock方法。
注意:scoped_lock也是独占锁,其源代码中定义如下;
  typedef unique_lock<mutex> scoped_lock;
  typedef unique_lock<timed_mutex> scoped_timed_lock;
▲ 共享锁:
boost::shared_lock<T>,其中的T只能是shared_mutex类。
当然还有其他一些锁:lock_guard, upgrade_lock等。

3. 读写锁的实现

 

typedef boost::shared_lock<boost::shared_mutex> readLock;

typedef boost::unique_lock<boost::shared_mutex> writeLock;

boost::shared_mutex rwmutex;

 

void readOnly()

{

readLock rdlock(rwmutex);

// do something

}

 

void writeOnly()

{

writeLock wtlock(rwmutex);

// do something

}

对同一个rwmutex,线程可以同时有多个readLock,这些readLock会阻塞任意一个企图获得writeLock的线程,直到所有的readLock对象都析构。如果writeLock首先获得了rwmutex,那么它会阻塞任意一个企图在rwmutex上获得readLock或者writeLock的线程。

4. boost::lock_guard<>和boost::unique_lock<>的区别

 

boost::mutex m;

void foo( )

{

boost::lock_guard<boost::mutex> lk(m);

process(data);

};

 

// lock_guard只能像上面这样使用,而unique_lock允许设置超时,推迟锁定lock以及在对象销毁之前unlock。

{

boost::unique_lock<boost::mutex> lk( m );

process( data );

lk.unlock( );

// do other thing

};

 

// 设置锁超时

{

boost::unique_lock<boost::timed_mutex> lk(m, std::chrono::milliseconds(3)); // 超时3秒

if(lk)

process( data );

};

 

5. 简单示例

 

namespace

{

boost::mutex mutex;

boost::shared_mutex shared_mutex;

 

void wait(int seconds)

{

boost::this_thread::sleep(boost::posix_time::seconds(seconds));

}

 

void threadfun1()

{

for (int i = 0; i < 5; ++i)

{

wait(1);

mutex.lock();

PRINT_DEBUG(i);

mutex.unlock();

}

}

 

void threadfun2()

{

for (int i = 0; i < 5; ++i)

{

wait(1);

boost::lock_guard<boost::mutex> lock(mutex);

PRINT_DEBUG(i);

}

}

 

void threadfun3()

{

for (int i = 0; i < 5; ++i)

{

wait(1);

// unique_lock<boost::mutex> = scoped_lock

boost::unique_lock<boost::mutex> lock(mutex);

std::cout << lock.owns_lock() << std::endl;

PRINT_DEBUG(i);

}

}

}

 

// 1. mutex例子

void test_thread_syn1()

{

boost::thread t1(&threadfun1);

boost::thread t2(&threadfun1);

 

t1.join();

t2.join();

}

 

// 2. lock_guard例子

void test_thread_syn2()

{

boost::thread t1(&threadfun2);

boost::thread t2(&threadfun2);

 

t1.join();

t2.join();

}

 

// 3. scoped_lock例子

void test_thread_syn3()

{

boost::thread t1(&threadfun3);

boost::thread t2(&threadfun3);

 

t1.join();

t2.join();

}

转载地址:http://culoi.baihongyu.com/

你可能感兴趣的文章
“抢菜大战”背后:生鲜电商的突击大考
查看>>
骁龙865+65W闪充!realme 真我X50 Pro 5G正式全球发布
查看>>
二月手机好评排行榜公布:华为第一,小米10没上榜
查看>>
英特尔展示业界首个一体封装光学以太网交换机
查看>>
年存10W+的年轻人都是怎么攒钱的
查看>>
苹果确认部分iPad Air 3会出现永久性黑屏:可免费维修
查看>>
iPhone 11全球供应紧张:何时补货未知
查看>>
小米40W无线闪充今年商用:MIX 4首发?
查看>>
国产手机卖的越来越贵,是好是坏?
查看>>
拼多多联合三奇医卫等企业,每天上架1000万只平价口罩
查看>>
5000起步没商量!vivo NEX 3S 5G手机正式发布:骁龙865+无界瀑布屏加持
查看>>
二月1500-1999元性价比排行榜:前三都是魅族手机
查看>>
疫情下的“双11”,品牌逆势增长背后的数字化变革
查看>>
支付宝变色了!被绑架了你就眨眨眼?官方如此回应...
查看>>
罗永浩欲直播带货,京东说可以帮忙联系
查看>>
B站,正在变成下一个“公众号”?
查看>>
小米启动安心服务月 手机家电产品可免费清洁保养
查看>>
刘作虎:一加新品将全系支持 5G
查看>>
滴滴顺风车上线新功能,特殊时期便捷出行
查看>>
网易云推出“音街”APP 入局免费K歌市场
查看>>