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

原创 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才支持



JAVA 并发编程-多个线程之间共享数据(六)

多线程共享数据的方式: 1,如果每个线程执行的代码相同,可以使用同一个Runnable对象,这个Runnable对象中有那个共享数据,例如,卖票系统就可以这么做。2,如果每个线程执行的代码不同,这时候...
  • hejingyuan6
  • hejingyuan6
  • 2015年07月25日 10:09
  • 15241

线程间共享数据

一、每个线程做执行的代码相同 若每个线程执行的代码相同,共享数据就比较方便。可以使用同一个Runnable对象,这个Runnable对象中就有那个共享数据。 public class MultiThr...
  • woshixuye
  • woshixuye
  • 2014年02月07日 10:48
  • 6416

【java并发】多个线程间共享数据

先看一个多线程间共享数据的问题: 设计四个线程,其中两个线程每次对data增加1,另外两个线程每次对data减少1。   从问题来看,很明显涉及到了线程间通数据的共享,四个线程共享一个data,共...
  • eson_15
  • eson_15
  • 2016年05月31日 22:56
  • 12717

进程间的数据共享

//========================================================================//TITLE://    进程间的数据共享//AU...
  • norains
  • norains
  • 2008年07月16日 23:19
  • 10736

多线程间的数据共享的几种实现方式比较

需求:设计4个线程,其中两个线程每次对j增加1,另外两个线程对j减少1. 实现数据共享的几种方式比较: 1.使用同一个runnable对象 如果每个线程执行的代码相同,那么可以使用同...
  • lwj0310
  • lwj0310
  • 2014年04月25日 11:28
  • 3361

java 线程间数据共享和android 线程间数据共享异同

(一)Java多线程编程访问共享对象和数据的方法 1、每个线程执行的代码相同,例如,卖票:多个窗口同时卖这100张票,这100张票需要多个线程共享。 2、每个线程执行的代码不同,例如:设计四个线程...
  • tianyeming
  • tianyeming
  • 2015年11月30日 15:23
  • 1101

[Windows] 如何在进程间共享数据?

tag:WM_COPYDATA,共享内存,内存映射文件,GlobalAlloc,DLL from: sorry, 忘记出处了.. 比如我有一个A程序,想给B程序发送一段字符串 我用SendM...
  • allenq
  • allenq
  • 2013年01月16日 13:15
  • 376

Windows中使用DLL在进程间共享数据

在Win16环境中,DLL的全局数据对每个载入它的进程来说都是相同的,因为所有的进程用的都收同一块地址空间;而在Win32环境中,情况却发生了变化,每个进程都有了它自己的地址空间,DLL函数中的代码所...
  • dengxu11
  • dengxu11
  • 2012年10月15日 11:30
  • 931

动态库中数据可以为多进程共享的方法

如何使一个dll数据值可以为多进程共享? 如何使动态数据库中的g_nvalue值为多进程共享呢? 实例如下: #pragma data_seg("hookdll") int g_nvalue ...
  • hanyujianke
  • hanyujianke
  • 2013年03月04日 19:12
  • 1077

使用内存映射文件在进程间共享数据

Windows提供了多种机制允许进程之间能够共享数据。比如,WM_COPYDATA消息,剪贴板,邮件槽(mailslot),管道(pipe),套接字(socket)等。在同一台机器上共享数据库最底层的...
  • lihao21
  • lihao21
  • 2014年08月08日 11:15
  • 3030
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:第三章(在线程间共享数据)
举报原因:
原因补充:

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