C++11信号量

信号量我感觉可以实现线程之间传递和唤醒。很有意思的一种线程实现和线程同步。
#include
#include
#include
#include<condition_variable>
using namespace std;
class semaphone
{
public:
semaphone(unsigned int count) :count(count) {}
void wait()
{
std::unique_lockstd::mutex lk(mtx);
count–;
while (count < 0)
{
con.wait(lk);
}
}
void signal()
{
unique_lockstd::mutex lg(mtx);
if (++count<=0)//++count<=0 肯定有线程在等待。
{
con.notify_one();
}
}
private:
std::mutex mtx;
std::condition_variable con;
int count;
};
semaphone plate(1), apple(1), orange(1);
void father()
{
while (true)
{
plate.wait();
cout << “plate a apple” << endl;
apple.signal();
}
}
void mather()
{
while (true)
{
plate.wait();
cout << “plate a orange” << endl;
orange.signal();
}
}
void sun()
{
while (true)
{
apple.wait();
cout << “get a apple” << endl;
plate.signal();
}
}
void daughter()
{
while (true)
{
orange.wait();
cout << “get a orange” << endl;
plate.signal();
}
}
int main()
{
thread t1(father), t2(mather), t3(sun), t4(daughter);
t1.join();
t2.join();
t3.join();
t4.join();
system(“pause”);
return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值