283-C++ pv操作

本文详细介绍了C++中的PV操作,包括wait()和notify_all/notify_one的工作原理,资源的释放,线程栈空间分配,信号量的类型如二元信号量和计数信号量,以及在生产者消费者问题中的应用。强调了在多线程中PV操作的原子性和资源管理的重要性,并给出了自定义PV操作的示例。
摘要由CSDN通过智能技术生成

1.wait()会使线程阻塞住,放到阻塞队列中,当执行notify_all的时候,回将阻塞队列中所有的线程置于CPU的阻塞态,然后这些线程争夺互斥量,哪个线程获得了互斥量,就从阻塞态转为就绪态,获得CPU的调度和执行,转为执行态

如果是nitify_one只会将其中的一个线程从阻塞队列中置于CPU的阻塞态,然后获得互斥量,从阻塞态转为就绪态,获得CPU的调度和执行,转为执行态

wait()会将资源释放掉

2.线程分配的栈空间的大小是1M,线程分配的栈空间是内核分配来的

3.信号量有二元信号量,只有1和0

4.release 增加内部计数器并除阻获取者(公开成员函数)p 就是要释放资源

5.acquire 增加内部计数器

6.pv操作是原子的

7.信号量中的值如果大于0,代表的是资源的个数,如果咸鱼0,代表阻塞线程的个数

8.计数信号量std::counting_semaphore

9.二元信号量std::binary_semaphore

10.生产者消费者问题在多线程中,如果只有一个生产者一个消费者,就不用加互斥量,如果有两个生产者,就必须加互斥量,而且常常使用块作用域

11.自己写一个pv操作

MySemaphore semp(1);中的这个1,既是资源的个数,也是并发线程的个数

MySemaphore semp(1);//生产 MySemaphore sems(0);//消费 一个设置成大于0,一个设置成0的目的是什么,如果消费者先执行,0减一等于-1,就会阻塞,所以目的就是让生产者先执行,而消费者后执行

class MySemaphore
{
   
private:
	int count;
	std::mutex mx;
	std::condition_variable cv;
public:
	MySemaphore(int val = 1
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值