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

c++11&14-多線程要點匯總

 更新時間:2020年06月02日 16:44:20   作者:晟夏的葉  
這篇文章主要介紹了c++11&14-多線程的使用方法,文中代碼非常詳細,方便大家更好的參考和學習,感興趣的朋友快來了解下

在C++11以前,C++的多線程編程均需依賴系統(tǒng)或第三方接口實現(xiàn),一定程度上影響了代碼的移植性。C++11中,引入了boost庫中的多線程部分內(nèi)容,形成C++標準,形成標準后的boost多線程編程部分接口基本沒有變化,這樣方便了以前使用boost接口開發(fā)的使用者切換使用C++標準接口,很容易把boost接口升級為C++標準接口。

我們通過如下幾部分介紹C++11多線程方面的接口及使用方法。

1. std::thread

std::thread為C++11的線程類,使用方法和boost接口一樣,非常方便,同時,C++11的std::thread解決了boost::thread中構(gòu)成參數(shù)限制的問題,我想這都是得益于C++11的可變參數(shù)的設(shè)計風格。

我們通過如下代碼熟悉下std::thread使用風格:

//c11.cpp
#include <iostream>
#include <thread>
void threadfun1()
{
 std::cout << "threadfun1 - 1\r\n" << std::endl;
 std::this_thread::sleep_for(std::chrono::seconds(1));
 std::cout << "threadfun1 - 2" << std::endl;
}
void threadfun2(int iParam, std::string sParam)
{
 std::cout << "threadfun2 - 1" << std::endl;
 std::this_thread::sleep_for(std::chrono::seconds(5));
 std::cout << "threadfun2 - 2" << std::endl;
}
int main()
{
 std::thread t1(threadfun1);
 std::thread t2(threadfun2, 10, "abc");
 t1.join();
 std::cout << "join" << std::endl;
 t2.detach();
 std::cout << "detach" << std::endl;
}

注意編譯時要使用:g++ c11.cpp -lpthread

運行結(jié)果:

threadfun1 - 1
threadfun2 - 1
threadfun1 - 2
join
detach

2. std::atomic

std::atomic為C++11封裝的原子數(shù)據(jù)類型。
什么是原子數(shù)據(jù)類型?從功能上看,簡單地說,原子數(shù)據(jù)類型不會發(fā)生數(shù)據(jù)競爭,能直接用在多線程中而不必我們用戶對其進行添加互斥資源鎖的類型。從實現(xiàn)上來看,我們可以理解為這些原子類型內(nèi)部自己加了鎖。

我們下面通過一個測試例子說明原子類型std::atomic的特點。

我們使用10個線程,把std::atomic類型的變量iCount從10減到1。

//c11.cpp
#include <thread>
#include <atomic>
#include <stdio.h>
#include <iostream>
#include <list>
std::atomic<bool> bIsReady(false);
std::atomic<int> iCount(10);
void threadfun1()
{
 if (!bIsReady) {
  std::this_thread::yield();
 }
 while (iCount > 0)
 {
  printf("iCount:%d\r\n", iCount--);
 }
}
int main()
{
 std::list<std::thread> lstThread;
 for (int i = 0; i < 10; ++i)
 {
  lstThread.push_back(std::thread(threadfun1));
 }
 for (auto& th : lstThread)
 {
  th.join();
 }
}

運行結(jié)果:

iCount:10
iCount:9
iCount:8
iCount:7
iCount:6
iCount:5
iCount:4
iCount:3
iCount:2
iCount:1

從上面的結(jié)果可以看到,iCount的最小結(jié)果是1,沒有出現(xiàn)小于等于0的情況,大家可以把iCount改成100甚至1000看看,可能會更直觀一點。

3. std::condition_variable

C++11中的std::condition_variable就像Linux下使用pthread_cond_wait和pthread_cond_signal一樣,可以讓線程休眠,直到被喚醒,然后再重新執(zhí)行。線程等待在多線程編程中使用非常頻繁,經(jīng)常需要等待一些異步執(zhí)行的條件的返回結(jié)果。

代碼如下:

#include <iostream> // std::cout
#include <thread> // std::thread
#include <mutex> // std::mutex, std::unique_lock
#include <condition_variable> // std::condition_variable
std::mutex mtx;
std::condition_variable cv;
bool ready = false;
void print_id(int id) {
 std::unique_lock<std::mutex> lck(mtx);
 while (!ready) cv.wait(lck); //線程將進入休眠
 // ...
 std::cout << "thread " << id << '\n';
}
void go() {
 std::unique_lock<std::mutex> lck(mtx);
 ready = true;
 cv.notify_all();
}
int main()
{
 std::thread threads[10];
 // spawn 10 threads:
 for (int i = 0; i<10; ++i)
  threads[i] = std::thread(print_id, i);
 std::cout << "10 threads ready to race...\n";
 go(); // go!
 for (auto& th : threads) th.join();
 return 0;
}

運行結(jié)果:

10 threads ready to race...
thread 0
thread 1
thread 2
thread 3
thread 4
thread 5
thread 6
thread 7
thread 8
thread 9

上面的代碼,在調(diào)用go函數(shù)之前,10個線程都處于休眠狀態(tài),當cv.notify_all()運行后,線程休眠結(jié)束,繼續(xù)往下運行,最終輸出如上結(jié)果。

以上就是c++11&14-多線程知識匯總的詳細內(nèi)容,更多關(guān)于c++11&14 多線程使用的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • C語言函數(shù)調(diào)用約定和返回值詳情

    C語言函數(shù)調(diào)用約定和返回值詳情

    這篇文章主要介紹了C語言函數(shù)調(diào)用約定和返回值詳情,函數(shù)調(diào)用約定不同,會影響函數(shù)生成的符號名,函數(shù)入?yún)㈨樞?,形參?nèi)存的清理者,更多相關(guān)需要的小伙伴可以參考下文詳情介紹
    2022-07-07
  • C++?哈希表的基本用法及說明

    C++?哈希表的基本用法及說明

    這篇文章主要介紹了C++?哈希表的基本用法及說明,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-09-09
  • C++集體數(shù)據(jù)交換實現(xiàn)示例講解

    C++集體數(shù)據(jù)交換實現(xiàn)示例講解

    這篇文章主要介紹了C++集體數(shù)據(jù)交換實現(xiàn)示例,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習吧
    2022-11-11
  • 使用MySQL編程實現(xiàn)C語言功能強大化步驟示例

    使用MySQL編程實現(xiàn)C語言功能強大化步驟示例

    這篇文章主要為大家介紹了使用MySQL編程實現(xiàn)C語言功能強大化步驟示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-05-05
  • 基于C++的農(nóng)夫過河問題算法設(shè)計與實現(xiàn)方法

    基于C++的農(nóng)夫過河問題算法設(shè)計與實現(xiàn)方法

    這篇文章主要介紹了基于C++的農(nóng)夫過河問題算法設(shè)計與實現(xiàn)方法,簡單描述了農(nóng)夫過河問題,并結(jié)合實例形式詳細分析了基于C++實現(xiàn)農(nóng)夫過河問題的相關(guān)算法實現(xiàn)步驟與操作技巧,需要的朋友可以參考下
    2017-09-09
  • C++ 類的構(gòu)造函數(shù)詳解及實例

    C++ 類的構(gòu)造函數(shù)詳解及實例

    這篇文章主要介紹了C++ 類的構(gòu)造函數(shù)詳解及實例的相關(guān)資料,學習C++ 的朋友對構(gòu)造函數(shù)肯定不陌生,非常重要的基礎(chǔ)知識,這里就詳細介紹下,需要的朋友可以參考下
    2016-12-12
  • 使用C++實現(xiàn)全排列算法的方法詳解

    使用C++實現(xiàn)全排列算法的方法詳解

    本篇文章是對使用C++實現(xiàn)全排列算法的方法進行了詳細的分析介紹,需要的朋友參考下
    2013-05-05
  • 一篇文章帶你了解C語言內(nèi)存對齊

    一篇文章帶你了解C語言內(nèi)存對齊

    在單片機下使用C語言編程時,內(nèi)存對齊的知識點必須掌握。掌握內(nèi)存對齊后,可以防止內(nèi)存碎片化,并且證明你有能力優(yōu)化內(nèi)存。嵌入式單片機開發(fā)的后階段,無非就是優(yōu)化內(nèi)存與優(yōu)化代碼執(zhí)行效率。
    2021-08-08
  • C++中std::invalid_argument報錯解決

    C++中std::invalid_argument報錯解決

    在C++編程中,std::invalid_argument是一個常見的異常,用于指示函數(shù)參數(shù)無效,文章詳細解析了這一異常的產(chǎn)生原因,并提供了多種解決策略,感興趣的可以了解一下
    2024-09-09
  • C語言中實現(xiàn)itoa函數(shù)的實例

    C語言中實現(xiàn)itoa函數(shù)的實例

    這篇文章主要介紹了C語言中實現(xiàn)itoa函數(shù)的實例的相關(guān)資料,希望通過本文能幫助到大家,讓大家實現(xiàn)這樣的功能,需要的朋友可以參考下
    2017-10-10

最新評論

九寨沟县| 吉木乃县| 密云县| 清水河县| 普兰店市| 闵行区| 江山市| 潍坊市| 车致| 正定县| 含山县| 广灵县| 德兴市| 宣武区| 陵川县| 缙云县| 凤凰县| 延安市| 辛集市| 安新县| 浑源县| 抚宁县| 洛扎县| 灵武市| 梅州市| 蓝田县| 唐河县| 武强县| 红河县| 微山县| 嫩江县| 高邮市| 大庆市| 通州市| 云龙县| 华容县| 鹿邑县| 缙云县| 遂宁市| 南昌市| 新营市|