C++11 實現信號量(吃水果問題)


轉載自  https://www.cnblogs.com/zhangbaochong/p/5879263.html

c++11中有互斥和條件變量但是並沒有信號量,但是利用互斥和條件變量很容易就能實現信號量。

1.信號量

  信號量是一個整數 count,提供兩個原子(atom,不可分割)操作:P 操作和 V 操作,或是說 wait 和 signal 操作。

  • P操作 (wait操作):count 減1;如果 count < 0 那么掛起執行線程;
  • V操作 (signal操作):count 加1;如果 count <= 0 那么喚醒一個執行線程;

2.信號量的實現

  吃水果問題:桌子有一只盤子,只允許放一個水果,父親專向盤子放蘋果,母親專向盤子放桔子 兒子專等吃盤子的桔子,女兒專等吃盤子的蘋果。只要盤子為空,父親或母親就可以向盤子放水果, 僅當盤子有自己需要的水果時,兒子和女兒可從盤子取出。請給出四個人之間的同步關系,並用 pv操作實現四個人的正確活動的問題。

  

#include <iostream>
#include <thread>
#include <mutex>
#include <condition_variable>

using namespace std;

class semaphore
{
public:
    //初始化信號個數
    semaphore(int value = 1) :count(value) {}

    void P()//相當於信號P操作,申請一個信號
    {
        unique_lock<mutex> lck(mtk);
        if (--count < 0)//資源不足掛起線程
            cv.wait(lck);
    }

    void V()//相當於V操作,釋放一個信號
    {
        unique_lock<mutex> lck(mtk);
        if (++count <= 0)//有線程掛起,喚醒一個
            cv.notify_one();
    }

private:
    int count;
    mutex mtk;
    condition_variable cv;
};

//有蘋果、橙子、盤子三種信號
semaphore plate(1), apple(0), orange(0);
void father()
{
    while (true)
    {
        //可用盤子減一
        plate.P();
        cout << "往盤中放一個蘋果" << endl;
        //蘋果加一
        apple.V();
    }
}

void mother()
{
    while (true)
    {
        //盤子減一
        plate.P();
        cout << "往盤中放一個橘子" << endl;
        //橙子加一
        orange.V();
    }
}

void son()
{
    while (true)
    {
        //蘋果減一
        apple.P();
        cout << "兒子吃蘋果" << endl;
        //盤子加一
        plate.V();
    }
}

void daughter()
{
    while (true)
    {
        //橙子減一
        orange.P();
        cout << "女兒吃橘子" << endl;
        //盤子加一
        plate.V();
    }
}

int main()
{
    thread f(father), m(mother), s(son), d(daughter);
    f.join();
    m.join();
    s.join();
    d.join();
    system("pause");
    return 0;
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM