一、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:
 C++ Code 
1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

 
#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_(
),

          threads_(numThreads)

    {

        
for (
int i = 
; i < numThreads; ++i)

        {

            
char name[
];

            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(
);

    sleep(
);

    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:
 C++ Code 
1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

 
#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 = 
; i < numThreads; ++i)

        {

            
char name[
];

            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(
);

       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(
);

    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++网络库》

muduo网络库学习之MutexLock类、MutexLockGuard类、Condition类、CountDownLatch类封装中的知识点的更多相关文章

  1. muduo网络库学习笔记(四) 通过eventfd实现的事件通知机制

    目录 muduo网络库学习笔记(四) 通过eventfd实现的事件通知机制 eventfd的使用 eventfd系统函数 使用示例 EventLoop对eventfd的封装 工作时序 runInLoo ...

  2. muduo网络库学习笔记(五) 链接器Connector与监听器Acceptor

    目录 muduo网络库学习笔记(五) 链接器Connector与监听器Acceptor Connector 系统函数connect 处理非阻塞connect的步骤: Connetor时序图 Accep ...

  3. muduo网络库学习笔记(三)TimerQueue定时器队列

    目录 muduo网络库学习笔记(三)TimerQueue定时器队列 Linux中的时间函数 timerfd简单使用介绍 timerfd示例 muduo中对timerfd的封装 TimerQueue的结 ...

  4. muduo 网络库学习之路(一)

    前提介绍: 本人是一名大三学生,主要使用C++开发,兴趣是高性能的服务器方面. 网络开发离不开网络库,所以今天开始学一个新的网络库,陈老师的muduo库 我参考的书籍就是陈老师自己关于muduo而编著 ...

  5. muduo网络库学习笔记(10):定时器的实现

    传统的Reactor通过控制select和poll的等待时间来实现定时,而现在在Linux中有了timerfd,我们可以用和处理IO事件相同的方式来处理定时,代码的一致性更好. 一.为什么选择time ...

  6. muduo网络库架构总结

    目录 muduo网络库简介 muduo网络库模块组成 Recator反应器 EventLoop的两个组件 TimerQueue定时器 Eventfd Connector和Acceptor连接器和监听器 ...

  7. muduo网络库源码学习————Timestamp.cc

    今天开始学习陈硕先生的muduo网络库,moduo网络库得到很多好评,陈硕先生自己也说核心代码不超过5000行,所以我觉得有必要拿过来好好学习下,学习的时候在源码上面添加一些自己的注释,方便日后理解, ...

  8. 长文梳理muduo网络库核心代码、剖析优秀编程细节

    前言 muduo库是陈硕个人开发的tcp网络编程库,支持Reactor模型,推荐大家阅读陈硕写的<Linux多线程服务端编程:使用muduo C++网络库>.本人前段时间出于个人学习.找工 ...

  9. muduo网络库使用心得

    上个月看了朋友推荐的mudo网络库,下完代码得知是国内同行的开源作品,甚是敬佩.下了mudo使用手冊和035版的代码看了下结构,感觉是一个比較成熟并且方便使用的网络库.本人手头也有自己的网络库,尽管不 ...

随机推荐

  1. ASP.NET MVC 项目文件夹结构

    首先,打开Visual Studio, 新建一个demo 项目的solution,选择 Blank Soution. 第二步,创建文件夹,按自己的需求创建.在这个Demo 中,我将创建4个文件夹. P ...

  2. vim使用方法:

    vim使用方法: 模式: 编辑模式.未编辑模式.命令行模式 i 插入形式进入编辑模式 a 增加 o 下行编辑 O 上行插入 : 进入命令行模式 esc 退出编辑模式 wq 保存文件 yy 复制 p 粘 ...

  3. kubeadmin 部署(centos 7)

    安装指定版本docker:# yum list docker-ce --showduplicates | sort -ryum install docker-ce-18.06.1.ce-3.el7vi ...

  4. referer null

    Referer表示超链接源的URL!你想看到实验效果,要从a-->(能过<a href="b.jsp")b页面,然后在B里可以取得Refere参数! String ur ...

  5. LeanCloud

    [Nodejs 访问 LeanCloud] 代码中使用 SDK: var AV = require('avoscloud-sdk') AV.initialize('AppID', ''AppKey) ...

  6. 单点登录(SSO)解决方案之 CAS客户端与Spring Security集成

    接上篇:单点登录(SSO)解决方案之 CAS服务端数据源设置及页面改造 Spring Security Spring Security是一个能够为基于Spring的企业应用系统提供声明式的安全访问控制 ...

  7. maven部署项目流程(区分环境)

    java项目区分环境打包部署到Linux 本文以一个简单的HelloWorld的项目为例,从pom.xml配置到打jar包,最后在linux上运行并验证来对maven部署的这套流程进行简单介绍. 为方 ...

  8. 树莓派项目——基于树莓派的WIFI网络互传系统设计

    一 实验原理 所需硬件:树莓派3B,TP-LINK WiFi模块,笔记本电脑,网线 所需软件:Putty.远程桌面链接.python.cmd界面 树莓派3B是只有信用卡大小的微型电脑,其系统基于Lin ...

  9. Mysql优化性能优化21条

    今天,数据库的操作越来越成为整个应用的性能瓶颈了,这点对于Web应用尤其明显.关于数据库的性能,这并不只是DBA才需要担心的事,而这更是我们程序员需要去关注的事情.当我们去设计数据库表结构,对操作数据 ...

  10. iOS - swift项目接入bugly - 报错, 配置符号表,下载Java环境,

    1.pod 安装,无需配置任何东西 2.终端找到路径: pod install 3.在 appdelegate 导入  import Bugly extension AppDelegate{ /// ...