muduo库学习之线程同步04——sleep不是同步原语

东阳的学习笔记

  1. 我认为sleep()/usleep()/nanosleep()只能出现在测试代码中,比如写单元测试的时候(备注:设计时间的单元测试不那么好写,短的如一两秒可以用sleep();长的如一小时、一天,则得想其他办法,比如把算法提取出来并把时间注入进去)
  2. 或者用于有意延长临界区,加速复现死锁的情况,就像“前文介绍的死锁”示范的那样
  3. sleep不具备memory barrier语义,它不能保证内存的可见性(参阅后面“C++多线程系统编程精要”的文章最开始的例子)

生产代码中线程的等待可分为两种:

  1. 一种是等待资源可用(要么等在select/poll/epoll_wait上,要么等在条件变量上,我们自己设计的“等待BlockingQueue/CountDownLatch”也可归入此处)
  2. 一种是等着进入临界区(等在mutex上)以便读写共享数据。这一种等待通常极短,否则程序性能和伸缩性就会有问题

在程序的正常执行中如果需要等待一段已知的时间,应该往event loop里注册一个timer,然后在timer的回调函数里接着干活,因为线程是个珍贵的共享资源,不能轻易浪费(阻塞也是浪费)

如果等待某个事件发生,那么应该采用条件变量IO事件回调不能用sleep来轮询

  • 不要使用下面这种业余做法:
while (true)
{
    if (!dataAvailable)
        sleep(some_time);
    else
        consumeDta();
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

东阳z

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值