专栏首页用户2442861的专栏muduo 5 网络库学习之MutexLock类、MutexLockGuard类、Condition类、CountDownLatch类封装中的知识点

muduo 5 网络库学习之MutexLock类、MutexLockGuard类、Condition类、CountDownLatch类封装中的知识点

一、MutexLock 类

class MutexLock : boost::noncopyable

二、MutexLockGuard类

class MutexLockGuard : boost::noncopyable

三、Condition类

class Condition : boost::noncopyable

某个线程:

加锁                                    

     while (条件)

          wait(); //1、解锁;2、等待通知;3、得到通知返回前重新加锁

解锁

另一个线程:

加锁

     更改条件

     通知notify(可以移到锁外)

解锁

四、CountDownLatch类

class CountDownLatch : boost::noncopyable

既可以用于所有子线程等待主线程发起 “起跑” 也可以用于主线程等待子线程初始化完毕才开始工作

下面写两个程序测试一下CountDownLatch 的作用:

CountDownLatch_test1:

#include <muduo/base/CountDownLatch.h>
#include <muduo/base/Thread.h>
#include <boost/bind.hpp>
#include <boost/ptr_container/ptr_vector.hpp>
#include <string>
#include <stdio.h>
using namespace muduo;
class Test
{
public:
    Test(int numThreads)
        : latch_(1),
          threads_(numThreads)
    {
        for (int i = 0; i < numThreads; ++i)
        {
            char name[32];
            snprintf(name, sizeof name, "work thread %d", i);
            threads_.push_back(new muduo::Thread(
                                   boost::bind(&Test::threadFunc, this), muduo::string(name)));
        }
        for_each(threads_.begin(), threads_.end(), boost::bind(&Thread::start, _1));
    }

    void run()
    {
        latch_.countDown();
    }

    void joinAll()
    {
        for_each(threads_.begin(), threads_.end(), boost::bind(&Thread::join, _1));
    }
private:

    void threadFunc()
    {
        latch_.wait();
        printf("tid=%d, %s started\n",
               CurrentThread::tid(),
               CurrentThread::name());


        printf("tid=%d, %s stopped\n",
               CurrentThread::tid(),
               CurrentThread::name());
    }

    CountDownLatch latch_;
    boost::ptr_vector<Thread> threads_;
};
int main()
{
    printf("pid=%d, tid=%d\n", ::getpid(), CurrentThread::tid());
    Test t(3);
    sleep(3);
    printf("pid=%d, tid=%d %s running ...\n", ::getpid(), CurrentThread::tid(), CurrentThread::name());
    t.run();
    t.joinAll();

    printf("number of created threads %d\n", Thread::numCreated());
}

执行结果如下:

simba@ubuntu:~/Documents/build/debug/bin$ ./countdownlatch_test1 pid=2994, tid=2994 pid=2994, tid=2994 main running ... tid=2997, work thread 2 started tid=2997, work thread 2 stopped tid=2996, work thread 1 started tid=2996, work thread 1 stopped tid=2995, work thread 0 started tid=2995, work thread 0 stopped number of created threads 3 simba@ubuntu:~/Documents/build/debug/bin$ 

可以看到其他三个线程一直等到主线程睡眠完执行run(),在里面执行latch_.countDown() 将计数减为0,进而执行notifyall 唤醒后,才开始执行下来。

CountDownLatch_test2:

#include <muduo/base/CountDownLatch.h>
#include <muduo/base/Thread.h>
#include <boost/bind.hpp>
#include <boost/ptr_container/ptr_vector.hpp>
#include <string>
#include <stdio.h>
using namespace muduo;
class Test
{
public:
    Test(int numThreads)
        : latch_(numThreads),
          threads_(numThreads)
    {
        for (int i = 0; i < numThreads; ++i)
        {
            char name[32];
            snprintf(name, sizeof name, "work thread %d", i);
            threads_.push_back(new muduo::Thread(
                                   boost::bind(&Test::threadFunc, this), muduo::string(name)));
        }
        for_each(threads_.begin(), threads_.end(), boost::bind(&muduo::Thread::start, _1));
    }

    void wait()
    {
        latch_.wait();
    }

    void joinAll()
    {
        for_each(threads_.begin(), threads_.end(), boost::bind(&Thread::join, _1));
    }
private:

    void threadFunc()
    {
        sleep(3);
       printf("tid=%d, %s started\n",
               CurrentThread::tid(),
               CurrentThread::name());

        latch_.countDown();
     

        printf("tid=%d, %s stopped\n",
               CurrentThread::tid(),
               CurrentThread::name());
    }

    CountDownLatch latch_;
    boost::ptr_vector<Thread> threads_;
};
int main()
{
    printf("pid=%d, tid=%d\n", ::getpid(), CurrentThread::tid());
    Test t(3);
    t.wait();
    printf("pid=%d, tid=%d %s running ...\n", ::getpid(), CurrentThread::tid(), CurrentThread::name());
    t.joinAll();

    printf("number of created threads %d\n", Thread::numCreated());
}

执行结果输出如下:

simba@ubuntu:~/Documents/build/debug/bin$ ./countdownlatch_test2 pid=4488, tid=4488 tid=4491, work thread 2 started tid=4491, work thread 2 stopped tid=4490, work thread 1 started tid=4490, work thread 1 stopped tid=4489, work thread 0 started pid=4488, tid=4488 main running ... tid=4489, work thread 0 stopped number of created threads 3

可以看出当其他三个线程都启动后,各自执行一次 latch_.countDown(),主线程wait() 返回继续执行下去。

参考:

muduo manual.pdf

《linux 多线程服务器编程:使用muduo c++网络库》

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • poll()函数总结

    http://www.cnblogs.com/Anker/archive/2013/08/15/3261006.html

    bear_fish
  • git以及github的使用(1)

    http://my.oschina.net/bxxfighting/blog/378196

    bear_fish
  • 局域网聊天工具(可发送图片与文件)

    http://blog.csdn.net/sunshinestation/article/details/4437404

    bear_fish
  • muduo网络库学习之MutexLock类、MutexLockGuard类、Condition类、CountDownLatch类封装中的知识点

    一、MutexLock 类 class MutexLock : boost::noncopyable ? 二、MutexLockGuard类 class Mut...

    s1mba
  • 【未完成】7-9 电路布线 (30 分)15分

    版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。

    韩旭051
  • 如何在Debian和Ubuntu下重新打包Deb文件

    本文将会为 Ubuntu、Linux Mint 和 Debian GUN/Linux 用户讲述,如何在它们基于Debian的Linux操作系统上轻松的解压和重新...

    Debian中国
  • 彻底搞懂epoll高效运行的原理

    这篇文章读不懂的没关系,可以先收藏一下。笔者准备介绍完epoll和NIO等知识点,然后写一篇Java网络IO模型的介绍,这样可以使Java网络IO的知识体系更加...

    全菜工程师小辉
  • Confluence 6 管理应用服务器内存设置

    应用服务器中的最小和最大 JVM Heap 空间配置将会影响系统的性能。Confluence 管理员可能希望对默认的配置进行修改,基于你系统的负载不同配置情况也...

    HoneyMoose
  • 2020年9月TIOBE指数发布,Java流行度降低,C++ 突起

    自从今年5月被C语言超越后,Java就一直位列第2,久久无法突破,市场份额也在逐月降低,本月的市场占比相较去年,降幅甚至高达-3.18%。

    APICloud
  • python模块之codecs

    python的内部是使用unicode来处理的,但是unicode的使用需要考虑的是它的编码格式有两种,一是UCS-2,它一共有65536个码 位,另一种是UC...

    周小董

扫码关注云+社区

领取腾讯云代金券