最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C++實現(xiàn)一個簡易版的事件(Event)的示例代碼

 更新時間:2022年11月15日 11:49:32   作者:程序員~彭國慶  
之前在?windows系統(tǒng)中開發(fā)應(yīng)用時,?遇到需要進行線程同步的時候幾乎都是使用的事件內(nèi)核對象?Event。本文為大家整理了C++實現(xiàn)一個簡易版的事件(Event)的相關(guān)資料,需要的可以參考一下

一、前言

利用 WaitForSingleObject 檢查內(nèi)核對象的狀態(tài)來進行實現(xiàn)。后來隨著需要開發(fā)跨平臺的程序后這種方式就不能使用了, 畢竟這是 windows 專屬。 POCO 庫在 windows之外的系統(tǒng)選擇利用 pthread 線程庫庫來實現(xiàn) Event, pthread 畢竟不在C++標(biāo)準(zhǔn)庫里面,假設(shè)要使用的話需要單獨配置。所以本文就利用 C++11之后的標(biāo)準(zhǔn)庫內(nèi)容來實現(xiàn)一個事件類, 方便使用。

本文代碼地址:https://github.com/pengguoqing/samples_code

二、實現(xiàn)

2.1 需要具備的功能

①支持多線程

②可以等待一定時間

2.2 代碼實現(xiàn)

一共提供四個對外接口, 分別如下:

//設(shè)置事件有信號
    inline void SetEvent()   const;
    
    //重置事件為無信號
    inline void ResetEvent() const;
    
    //持續(xù)等待直到事件有信號, 如果是 Auto 模式則必須等待到該線程能拿到狀態(tài)
    inline void Wait()       const;    
    
    //等待事件一定時間, 時間范圍內(nèi)事件有信號則返回 true,否則返回 false
    template <typename Rep, typename Period>
    inline bool tryWait(const std::chrono::duration<Rep, Period>& duratio) const;

類內(nèi)部再對具體的實現(xiàn)進行一下封裝

struct EventImpl
	{
		explicit EventImpl(Mode mode, bool initState);
		~EventImpl() = default;
		inline void  Set();
		inline void  Reset();
		inline void  Wait();

		template <typename Rep, typename Period>
		inline bool Wait_for(const std::chrono::duration<Rep, Period>& duration);

		std::mutex				m_mutex;
		std::condition_variable m_condi;
		bool					m_signal;
		const Mode				m_mode;
	};

使用 unique_ptr 對 EventImpl 資源進行管理:

const std::shared_ptr<EventImpl> m_event;

因為沒有裸露的指針資源,移動和拷貝函數(shù)就直接全部使用編譯器默認的

explicit CXEvent(Mode mode = Mode::Auto, bool initstate = false);
~CXEvent() = default;

三、測試

測試用一個事件實例來實現(xiàn)兩個線程的同步測試, 鍵盤輸入字符 ‘s’ 觸發(fā)一次事件, 每個線程 Wait() 兩次事件后,再測試一下 tryWait() 時間。代碼如下:

using namespace std;

static CXEvent kEvent;
static constexpr int testCnt = 3;

TestEventFunc1(const CXEvent& refEvent)
{
    for (int i=0; i< testCnt; i++)
    {
        
		if (i == testCnt-1)
		{
			auto begin = chrono::high_resolution_clock::now();
			kEvent.tryWait(5000ms);
			auto end = chrono::high_resolution_clock::now();
			auto duration = chrono::duration_cast<chrono::microseconds>(end - begin);
			cout << "TestEventFunc1"<<"tryWait time:"<< duration.count() << endl;
		}
		else
		{
			kEvent.Wait();
			cout << "TestEventFunc1 Wait" << endl;
		}
       
    }

}
TestEventFunc2(const CXEvent& refEvent)
{
	for (int i=0; i<testCnt; i++)
	{
		if (i == testCnt-1)
		{
			auto begin = chrono::high_resolution_clock::now();
			kEvent.tryWait(5000ms);
			auto end = chrono::high_resolution_clock::now();
			auto duration = chrono::duration_cast<chrono::microseconds>(end - begin);
			cout << "TestEventFunc2" << "tryWait time:"<< duration.count()<< endl;
		}
		else
		{
			kEvent.Wait();
			cout << "TestEventFunc2 Wait" << endl;
		}
		
	}
}

int main()
{
   	CXEvent refEvent1(kEvent);
	CXEvent refEvent2(kEvent);
    std::thread testTh1(TestEventFunc1, refEvent1);
    std::thread testTh2(TestEventFunc2, refEvent2);

	int cinCnt{0};
	char inputCmd {'R'};
	cin.get(inputCmd);
	while ('q'!=inputCmd && cinCnt<testCnt*2)
	{
		if ('s' == inputCmd)
		{
			kEvent.SetEvent();
			cinCnt++;
		}
		cin.get(inputCmd);
	}

   
	if (testTh1.joinable())
	{
		testTh1.join();
	}

	if (testTh2.joinable())
	{
		testTh2.join();
	}

	std::cout << "test set event and wait_for event\n";
}

期望結(jié)果是每輸入一次 ‘s’ 回車后,TestEventFunc1或者TestEventFunc2線程函數(shù)中的循環(huán)體就會被執(zhí)行一次,每個循環(huán)體執(zhí)行兩次后等待 5 秒線程就退出,再輸入‘q’ 退出程序。實際運行結(jié)果如下:

符合預(yù)期。

到此這篇關(guān)于C++實現(xiàn)一個簡易版的事件(Event)的示例代碼的文章就介紹到這了,更多相關(guān)C++事件內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 詳解C++11 線程休眠函數(shù)

    詳解C++11 線程休眠函數(shù)

    這篇文章主要介紹了C++11 線程休眠函數(shù)的相關(guān)資料,幫助大家更好的理解和學(xué)習(xí)C++11,感興趣的朋友可以了解下
    2020-10-10
  • C++讀取INI配置文件類實例詳解

    C++讀取INI配置文件類實例詳解

    這篇文章主要介紹了C++讀取INI配置文件類的實現(xiàn)方法,需要的朋友可以參考下
    2014-07-07
  • 淺析STL中的常用算法

    淺析STL中的常用算法

    以下是對STL中的常用算法進行了詳細的介紹,需要的朋友可以過來參考下,希望對大家有所幫助
    2013-09-09
  • C語言動態(tài)內(nèi)存管理分析總結(jié)

    C語言動態(tài)內(nèi)存管理分析總結(jié)

    C語言中開辟內(nèi)存有很多種方式,目前我們最常用的也就是數(shù)組,但數(shù)組是在我們用到他之前就得設(shè)定好它的長度,有時很不方便。隨意我們來探究動態(tài)內(nèi)存管理
    2021-11-11
  • C++?超詳細梳理繼承的概念與使用

    C++?超詳細梳理繼承的概念與使用

    這篇文章主要介紹了C++?多繼承詳情,C++支持多繼承,即允許一個類同時繼承多個類。只有C++等少數(shù)語言支持多繼承,下面我們就來看看具體的多繼承介紹吧,需要的朋友可以參考一下
    2022-03-03
  • C++中求數(shù)組長度的方法詳解

    C++中求數(shù)組長度的方法詳解

    C++中沒有直接提供求數(shù)組長度的方法,提供了sizeof(),begin(),end()等方法,可以供求數(shù)組長度使用,文中通過代碼示例給大家講解的非常詳細,具有一定的參考價值,需要的朋友可以參考下
    2023-12-12
  • C++實現(xiàn)的O(n)復(fù)雜度內(nèi)查找第K大數(shù)算法示例

    C++實現(xiàn)的O(n)復(fù)雜度內(nèi)查找第K大數(shù)算法示例

    這篇文章主要介紹了C++實現(xiàn)的O(n)復(fù)雜度內(nèi)查找第K大數(shù)算法,結(jié)合實例形式分析了算法的原理以及具體實現(xiàn)方法,需要的朋友可以參考下
    2017-08-08
  • C++ std::any的模擬實現(xiàn)

    C++ std::any的模擬實現(xiàn)

    std::any是C++標(biāo)準(zhǔn)庫中的一個類,std::any對象可以存儲除單例等特殊情況外的任何類型的數(shù)據(jù),本文主要介紹了C++ std::any的模擬實現(xiàn),具有一定的參考價值,感興趣的可以了解一下
    2024-02-02
  • C++實現(xiàn)LeetCode(211.添加和查找單詞-數(shù)據(jù)結(jié)構(gòu)設(shè)計)

    C++實現(xiàn)LeetCode(211.添加和查找單詞-數(shù)據(jù)結(jié)構(gòu)設(shè)計)

    這篇文章主要介紹了C++實現(xiàn)LeetCode(211.添加和查找單詞-數(shù)據(jù)結(jié)構(gòu)設(shè)計),本篇文章通過簡要的案例,講解了該項技術(shù)的了解與使用,以下就是詳細內(nèi)容,需要的朋友可以參考下
    2021-08-08
  • C++算術(shù)運算符與類型轉(zhuǎn)換

    C++算術(shù)運算符與類型轉(zhuǎn)換

    這篇文章主要介紹了C++算術(shù)運算符與類型轉(zhuǎn)換,C++當(dāng)中提供5種基礎(chǔ)的算術(shù)運算符,分別是加法、減法、乘法、除法和取模。下main我們就一起來看看下面文章得具體舉例與說明,需要的朋友可以參考一下,希望對你有所幫助
    2021-11-11

最新評論

桂平市| 集安市| 长顺县| 黄浦区| 融水| 汝阳县| 铜陵市| 合江县| 安西县| 深水埗区| 遵义县| 山阳县| 威宁| 大荔县| 姜堰市| 建昌县| 成武县| 葫芦岛市| 宁海县| 西峡县| 密山市| 宁化县| 南城县| 政和县| 阿城市| 色达县| 彭阳县| 广德县| 泽州县| 普格县| 龙川县| 定远县| 陕西省| 资源县| 汶川县| 宝丰县| 虹口区| 彰武县| 车致| 石嘴山市| 孝义市|