原创 boost库之thread之二

2010-7-2 21:14 5399 0 分类: 工程师职场

互斥锁与共享锁

互斥时下面的锁方法适用

void lock( )

bool try_lock( )

bool timed_lock(boost::system_time const& abs_time)

void unlock( )

多读/单写模式适用于下面这些锁

void lock_shared( )

bool try_lock_shared( )

bool timed_lock_shared(boost::system_time const& abs_time)

void unlock_shared( )

timed_lock有两个重载实现:一个用于相对时间,一个用于绝对时间。

以上的都是锁的概念,最好的解释参考《操作系统》的任意一本教科书。需要注意的是,这些不是全局函数而是成员函数,有不同的锁定类型,它们提供这些函数的实现。锁定类型在下一章节。

boostshared lock作了一些扩展,有一些方法可以升级到独占状态,其他线程拥有对应的共享所有权,升级会失败。

void lock_upgrade( )

bool unlock_upgrade( )

void unlock_upgrade_and_lock( )

void unlock_and_lock_upgrade( )

void unlock_upgrade_and_lock_shared( )

锁定类型

lock_guard 自动锁

template<typename Mutex>

class lock_guard

{

public:

       explicit lock_guard(Mutex& m_); // 这种类型应该是互斥锁

       lock_guard(Mutex& m_, boost::adopt_lock_t);

};

unique_lock 高级自动锁

template<typename Lockable>
class unique_lock
{
public:
    unique_lock();
    explicit unique_lock(Lockable& m_);

    void swap(unique_lock& other);

    void lock();
    bool try_lock();

    template<typename TimeDuration>
    bool timed_lock(TimeDuration const& relative_time);
    bool timed_lock(::boost::system_time const& absolute_time);

    void unlock();

    bool owns_lock() const;
    operator unspecified-bool-type() const;
    bool operator!() const;

    Lockable* mutex() const;
    Lockable* release();
};

这是一种复杂的自动锁,特点是可以延迟lock,自处理unlock,可以拷贝构造,还可以获得互斥对象(mutex())。只有在复杂应用时才考虑unique_lock,否则lock_guard与作用域配合作为首选方案。

shared_lock   共享锁

upgrade_lock 升级锁

lock(Lockable1, Lockable2, …) 自由函数

lock(begin, end)   自由函数

try_lock(Lockable1, Lockable2, …) 自由函数

try_lock(begin, end)    自由函数

Mutex    互斥类型

class mutex: boost::noncopyable
{
public:
    void lock();
    bool try_lock();
    void unlock();
    
    typedef unique_lock<mutex> scoped_lock;
};

mutex通常不单独使用,而是配合上面的互斥类。至于那个typedef scoped_lock倒是经常地用。先是定义一个各个线程都可见的mutex对象,在各个线程中用scoped_lock, unique_lock, lock_guardmutex::scoped_lock s1; unque_lock<mutex> s2; lock_guard<mutex> s3;

timed_mutex 带超时的互斥类

class timed_mutex: boost::noncopyable
{
public:
    void lock();
    void unlock();
    bool try_lock();
    bool timed_lock(system_time const & abs_time);

    template<typename TimeDuration>
    bool timed_lock(TimeDuration const & relative_time);

    typedef unique_lock<timed_mutex> scoped_timed_lock;
    typedef scoped_timed_lock scoped_lock;
};

跟上面的mutex类似。

recursive_mutex 递归式的互斥量

recursive_timed_mutex      带超时的递归式的互斥量

shared_mutex             共享互斥量

条件变量

条件变量是个好东西,防止死锁的绝密武器。(我自己这样想的)

condition_variable

class condition_variable

{

public:

    void notify_one();
  void notify_all();
   void wait(boost::unique_lock<boost::mutex>& lock);
   bool timed_wait(boost::unique_lock<boost::mutex>& lock,boost::system_time const& abs_time);
  bool timed_wait(boost::unique_lock<boost::mutex>& lock,duration_type const& rel_time);
};

notify_one()notify_all()好理解,但是所有的wait都需要一个unique_lock,似乎有点出乎意料。

condition_variable的作用如同一个bool变量,至于为什么在wait部分需要一个unique锁,这源于wait本身的实现需要:在进入wait前加锁,在退出wait后解锁。此时有两种可能的情况,一,如果初始化unique_lockmutex是全局变量,那么一时刻只有一个线程在while循环中等待condition,其它线程没办法通过循环前的lock关;二、如果mutexunique_lock一样是局部变量那么每个线程都在while中等待。这两种都行得通。


文章评论0条评论)

登录后参与讨论
相关推荐阅读
shougangshi_469315297 2011-08-16 16:10
template c++
http://www.codeguru.com/forum/archive/index.php/t-333284.htmlhttp://www.codeguru.com/forum/archive/i...
shougangshi_469315297 2011-07-06 20:55
Linux下的Source Insight+Ubuntu 10.04使用Wine安装Source I
Linux下的Source Insighthttp://rogerer.javaeye.com/blog/755346    在网上看到一朋友写了一篇推荐Linux下代码阅读工具Source ...
shougangshi_469315297 2011-07-05 18:28
转]atoi、atof、_itoa、_itow 函数使用
http://www.cnblogs.com/heaad/archive/2009/08/10/1542511.htmlatoi、atof、itoa、itow函数是windows平台下实现字符串与数值...
shougangshi_469315297 2011-07-05 18:25
【转】嵌入式经典面试题
嵌入式经典面试题(转)   C语言测试是招聘嵌入式系统程序员过程中必须而且有效的方法。这些年,我既参加也组织了许多这种测试,在这过程中我意识到这些测试能为面试者和被面试者提供许多有用信息,此外,撇开面...
shougangshi_469315297 2011-07-05 16:13
U-boot中TFTP 解释
http://www.cnblogs.com/heaad/archive/2009/08/10/1542538.html一、      概述      U-boot中的TFTP用于发送较小的文件。下层...
shougangshi_469315297 2011-07-05 15:44
Linux驱动模块初始教程:一步一步,从helloworld到insmod->printk!!!
http://hi.baidu.com/ctgukuang/blog/item/5ee388924593c099a877a4ef.html【1】有必要查询下Linux内核# uname -r2.6.2...
广告
我要评论
0
0
广告
关闭 热点推荐上一条 /5 下一条