C++ 11的一些新特性(2)

最近学习了一下C++11的新特性,发现c++的进步很快,已经不在是我最早认识的那个c++了。

我的感觉是c++的更新的三个方向:

  1. 一个是语法层面上的
    语法层面上面应该是借鉴了像python语言这样的语法,比如for -each,auto 等这样的“语法糖”。

  2. STL / 第三方库 下面的更新
    比如加入unorder_map / set 等
    thread库,之前c++在window下和linux创建线程的api完全不一样,但是c++11之后,可以使用头文件thread,基本上统一了跨平台的问题。我觉得这个很好。

  3. c++核心的更新
    比如加入智能指针,lambda函数,右值引用等


下面打算写的是 c++11 下面的线程库。基本上是参考cppreference : http://en.cppreference.com/w/cpp/thread/thread

还有一个不错的教程:
https://www.cnblogs.com/ittinybird/p/4820142.html

一个简单的例子(注意这段代码在window下也是可以运行的):

#include <iostream>
#include <utility>
#include <thread>
#include <chrono>
#include <functional>
#include <atomic>
using namespace std;

void f1(int n)
{
    for (int i = 0; i < 5; ++i) {
        std::cout << "Thread " << n << " executing\n";
        std::this_thread::sleep_for(std::chrono::milliseconds(10));
    }
}

int main()
{
    int n = 0;
    std::thread t1(f1,n); 
    t1.join();

    std::cout << "Final value of n is " << n << '\n';

    system("pause");
    return 0;
}

进阶版的例子

void f1(int n)
{
    for (int i = 0; i < 5; ++i) {
        std::cout << "Thread " << n << " executing\n";
        std::this_thread::sleep_for(std::chrono::milliseconds(10));
    }
}

int main()
{
    //使用智能指针的写法
    int n = 0;
    auto res = make_shared<thread>(f1, n);
    res->join();

    system("pause");
    return 0;
}

上面是关于thread的api,另外关于线程的 join 和 detach 的区别。

在启动了一个线程(创建了一个thread对象)之后,当这个线程结束的时候,我们如何去回收线程所使用的资源呢?

thread库给我们两种选择:1.加入式(join()) 2.分离式(detach())。join指的是主线程卡在join的地方,等待子线程执行完毕,然后回收他。detach指的子线程和主线程已经不再有任何交互了,各干各的事情。

join模式
detach模式

线程同步的例子

  • mutex
  • 条件变量
#include <iostream>
#include <utility>
#include <thread>
#include <chrono>
#include <functional>
#include <atomic>
#include <mutex>                // std::mutex, std::unique_lock
#include <condition_variable>   // std::condition_variable
using namespace std;

std::mutex mtx;                 // 全局互斥锁.
std::condition_variable cv;     // 全局条件变量.
bool ready = false;             // 全局标志位.

void do_print_id(int id)
{
    std::unique_lock <std::mutex> lck(mtx);
    cout << "-- test --" << endl;
    while (!ready)                          // 如果标志位不为 true, 则等待...
        cv.wait(lck);                       // 当前线程被阻塞, 当全局标志位变为 true 之后,
                                            // 线程被唤醒, 继续往下执行打印线程编号id.
    std::cout << "thread " << id << '\n';
}

void go()
{
    std::unique_lock <std::mutex> lck(mtx);
    ready = true;                           // 设置全局标志位为 true.
    cv.notify_all();                        // 唤醒所有线程.
}                                           // unique_lock 在自己的声明周期结束的时候 自动释放锁

int main()
{
    std::thread threads[10];
    // spawn 10 threads:
    for (int i = 0; i < 10; ++i)
        threads[i] = std::thread(do_print_id, i);

    std::cout << "10 threads ready to race...\n";
    go(); // go!

    for (auto & th : threads)
        th.join();


    system("pause");
    return 0;
}
other

c++11的线程封装的很好,用起来也很方便,而且还跨平台。

推荐一个github :
《C++ 并发编程指南》
https://github.com/forhappy/Cplusplus-Concurrency-In-Practice

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 218,546评论 6 507
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,224评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,911评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,737评论 1 294
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,753评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,598评论 1 305
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,338评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,249评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,696评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,888评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,013评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,731评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,348评论 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,929评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,048评论 1 270
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,203评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,960评论 2 355

推荐阅读更多精彩内容

  • 对于C++这样的语言来说,除了具有普适、通用等特性外,在一些实际应用方面也是不容忽视的, 对齐支持 数据对齐 在了...
    认真学计算机阅读 5,512评论 0 5
  • 丹尼是洛克镇上少有的几个外来户之一。丹尼在洛克镇定居已有两年了,镇上居民对他的普遍认识是他是个大好人。没人会相信丹...
    路忆尘阅读 572评论 0 9
  • 我是个疯癫的人,从来都不会喜欢每一天都过成相同的样子。 小时候,为了每一天都过得不一样我会做很多事,买一件物品,写...
    冯小芑阅读 866评论 0 2
  • 2017.7.30日记 妈晾了够我吃一星期的面,厨房里还剩不少食材。爸把屋子又整理打扫了一番,和去年暑假一样桶里的...
    以清Way阅读 269评论 0 1
  • 从当上护士的这一天我们就注定了要三班倒,为了病人,职业的特殊性要求我们跟其它的行业不能一样! 超额的工作量和高度的...
    灵魂深处是无言阅读 289评论 0 0