第三章(在线程间共享数据)

原创 2015年07月08日 08:48:11

1、Mutex信号量,

简单方便.lock_guard构造时调用T的lock,析构时调用unlock。没有其它的操作了。同一个线程调用多次也会导致锁定。

void CThreadLockTest::LockMutext()
{
    lock_guard<mutex> guard(some_mutex_);
    int new_value = 10;
    some_list_.push_back(new_value);
}


2、共享信号量

目前C++标准不支持,boost才支持。需要使用shared_mutex作为信号变量

shared_lock即为共享锁,在lock时候会增加判断中会判断。可以多次使用只读锁。

unique_lock即为独占锁。

void CThreadLockTest::LockSharedMutex()
{
    boost::shared_mutex entry_mutext;
    // 共享锁,只读可以用多次
    boost::shared_lock<boost::shared_mutex> lk1(entry_mutext);。最后调用的是shared_mutex的lock_shared接口
    boost::shared_lock<boost::shared_mutex> lk2(entry_mutext);

    // 独占锁
    boost::unique_lock<boost::shared_mutex> lk3(entry_mutext);。最后调用的是shared_mutex的lock接口
}


3、递归信号量

可以支持同一个线程多次锁定,当然也需要多次释放

mute都是继承自mutexbase,里面有个flag标记,递归锁就是默认构造时将flag设置为了0x100

内部会判断同一个线程id就可以锁多次。不同线程id的话语普通锁一样。不推荐使用

void CThreadLockTest::LockRecursiveMuex()
{
    std::lock_guard<std::recursive_mutex> lk1(recusive_mutex_1);
    std::lock_guard<std::recursive_mutex> lk2(recusive_mutex_1);

}


4、对应的锁

lock_guard:最简单,构造锁定,析构释放。构造函数中也有参数表示是否立即锁定参数

unique_lock:增加了lock,unlock接口,更加灵活。同时也增加了一个参数表示自己是否拥有该锁的所有权。

boost::shared_lock:配合shared_mutex使用


5、只执行一次接口。可以在单键等情况下使用,线程安全

once_flag:只执行一次标记

call_once:只执行一次接口


std::shared_ptr<CTest> resource_ptr;
std::once_flag resource_flag;
void InitResource(int)
{
    resource_ptr.reset(new CTest);
}

void CThreadLockTest::CallOnceFunction()
{
    // 成员函数的调用
    std::call_once(resource_flag, &CThreadLockTest::LockMutext, this);

    // 全局函数的调用,并且支持参数
    std::call_once(resource_flag, InitResource, 10);
}


6、避免死锁

同时锁定多把锁,要不全部锁定成功,要不失败。防止两把锁的拥有者属于不同线程导致互相等待

void CThreadLockTest::LockMoreMutex()
{
    // 同时锁两个mutext
    std::lock(some_mutex_, some_mutext_2_);

    // 再赋值给lock_guard只是为了方便析构释放。
    // 使用adopt_lock作为第二个参数是希望guard1不要再去锁了,因为std::lock已经有锁了
    lock_guard<mutex> guard1(some_mutex_, std::adopt_lock);
    lock_guard<mutex> guard2(some_mutext_2_, std::adopt_lock);
    int new_value = 10;
    some_list_.push_back(new_value);
    some_list2_.push_back(new_value);
}

也可以自己实现,对锁增加一个参数:优先级,与lock思想一样,锁定了高优先级再去锁定低优先级能成功,反之则失败


7、线程局部变量

vs2013也不支持。2015才支持



C++并发编程学习——3.在线程间共享数据

线程之间共享数据的问题 (1)竞争条件 竞争条件指多个线程或者进程在读写一个共享数据时结果依赖于它们执行的相对时间的情形。 竞争条件发生在当多个进程或者线程在读写数据时,其最终的的结果依赖于多个进...

Java多线程/并发05、synchronized应用实例:线程间操作共享数据

电商平台中最重要的一点就是卖东西。同个商品不能无限制的卖下去的,因为商品有库存量,超过库存就不能卖了。 这里,约定一个规则,下单使库存减n,取消订单使库存加m。库存数量不可以小于0。 假设平台上同...
  • soonfly
  • soonfly
  • 2017年04月28日 16:03
  • 465

Qt学习:线程间共享数据

Qt线程间共享数据主要有两种方式: 使用共享内存。即使用一个两个线程都能够共享的变量(如全局变量),这样两个线程都能够访问和修改该变量,从而达到共享数据的目的;使用singal/slot机制,把...

无锁实现线程间共享数据

这几天比较没那么忙,review了一下以前写的一个linux网络库,看得我略微有点纠结,大概流程如下图:         MainThread创建连接fd及处理相关的数据结构,然后加到链表Shar...
  • LIFEXX
  • LIFEXX
  • 2016年10月27日 14:39
  • 396

详解 Qt 线程间共享数据

转自:http://mobile.51cto.com/symbian-272626.htm Qt 线程间共享数据是本文介绍的内容,多的不说,先来啃内容。Qt线程间共享数据主要有两种方式: 使用共享...
  • fqx111
  • fqx111
  • 2013年06月04日 14:13
  • 576

详解 Qt 线程间共享数据

使用共享内存。即使用一个两个线程都能够共享的变量(如全局变量),这样两个线程都能够访问和修改该变量,从而达到共享数据的目的。 Qt 线程间共享数据是本文介绍的内容,多的不说,先来啃内容。Qt线程间共...

C++多线程学习---线程间的共享数据

多线程间的共享数据如果不加以约束是有问题的。最简单的方法就是对数据结构采用某种保护机制,通俗的表达就是: 确保只有进行修改的线程才能看到不变量被破坏时的中间状态。从其他访问线程的角度来看,修改不是已经...
  • PENGH56
  • PENGH56
  • 2016年11月21日 15:02
  • 2078

Cpp Concurrency In Action(读书笔记2)——线程间共享数据

前言 上一篇:线程入门及管理(点击打开链接)。 避免恶性条件竞争
  • BestZem
  • BestZem
  • 2016年10月24日 21:42
  • 458

多线程间共享数据,简单Demo

转载至:http://blog.csdn.net/eson_15/article/details/51546302 多线程间共享数据的问题: 设计四个线程,其中两个线程每次对data增加1...

线程间共享数据

一、每个线程做执行的代码相同 若每个线程执行的代码相同,共享数据就比较方便。可以使用同一个Runnable对象,这个Runnable对象中就有那个共享数据。 public class MultiThr...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:第三章(在线程间共享数据)
举报原因:
原因补充:

(最多只允许输入30个字)