condition

class condition:noncopyable
{
};

作用:

实现了最简单condtion操作,包括init,destroy,wait,notify,notifyAll,waitforseconds操作,
内部数据也很简单,mutexlock& m_mutex和pthread_cond_t m_cond
使用方法和std::cond一样

成员变量:

private:
mutexlock& m_mutex;
pthread_cond_t m_cond;

成员函数:

public:
explicit condition(mutexlock& mutex):m_mutex(mutex)
{
pthread_cond_init(&m_cond,NULL);
}
~condition()
{
pthread_cond_destroy(&m_cond);
}
//不满足条件时wait,把mutexlock中m_holder移除,同时该线程释放该锁
void wait()
{
mutexlock::UnassignGuard ug(m_mutex);
pthread_cond_wait(&m_cond,m_mutex.getPthreadMutex());
} //等待一段时间而不是一直等待
bool waitForSeconds(double seconds); //唤醒cond阻塞队列中的第一个线程
void notify()
{
pthread_cond_signal(&m_cond);
} //唤醒cond阻塞队列中的所有线程
void notifyAll()
{
pthread_cond_broadcast(&m_cond);
}

测试:

使用condtion和mutex完成一个生产者消费者同步的小例子。

#include"base/mutex.h"
#include"base/condition.h"
#include<thread>
#include <stdio.h>
#include<queue>
#include<iostream> #define MAXQUEUE 5
mymuduo::mutexlock mutex;
mymuduo::condition cond(mutex);
std::queue<int> task_queue; namespace mymuduo{
namespace currentthread { void cacheTid()
{
}
}
} void provider()
{
while()
{
std::this_thread::sleep_for(std::chrono::milliseconds());
mymuduo::mutexlockguard mlg(mutex);
while(task_queue.size()>=MAXQUEUE)
cond.wait();
task_queue.push(rand()%);
std::cout<<"push "<<task_queue.front()<<std::endl;
cond.notifyAll();
}
} void consumer()
{
while()
{
mymuduo::mutexlockguard mlg(mutex);
while(task_queue.empty())
cond.wait();
std::cout<<"pop "<<task_queue.front()<<std::endl;
task_queue.pop();
cond.notifyAll();
}
} int main()
{
std::thread t[];
t[]=std::thread(provider);
t[]=std::thread(consumer); t[].join();t[].join();
}

最新文章

  1. ListView 刷新加载控件
  2. LOL
  3. Python for Informatics 第11章 正则表达式一(译)
  4. 孙鑫视频学习:对第10章设置线宽时为什么不调用UpDateData(TRUE)的理解
  5. CSS中控制换行的四种属性
  6. Python基础05 缩进和选择
  7. BNUOJ-26476 Doorman 贪心
  8. POJ2676 Sudoku(dfs)
  9. 单片机 认识HEX文件
  10. js跨域总结
  11. selenium 环境搭建
  12. NetCore2.0技术文章目录
  13. 小米Note 2简单卡刷开发版启用root超级权限的步骤
  14. python学习:修改字符串大小写
  15. iptables介绍
  16. openpyxl一点心得
  17. (网页)bootstrap模态框手动关闭(转)
  18. NodeJS的优缺点
  19. C与指针练习题4.14.1
  20. [记录] CSS 左边元素定长,右边元素获得剩余长度

热门文章

  1. CSV文件指定页脚
  2. Promise核心基础
  3. 一些html基础概念
  4. stm32f407 oled iic例程,成功点亮oled屏
  5. 详解Flask上下文
  6. easyui 属性 事件 方法
  7. 把Spring Cloud Data Flow部署在Kubernetes上,再跑个任务试试
  8. Linux发行版-Manjaro
  9. 实验08——java百文百鸡
  10. 025_go语言中的通道同步