c++并发实践简明教程

        关键词:并发    并行    C++11    多线程    Concurrency    Action

0 写在前面

        该文章素材来源于《C++ Concurrency in Action 2nd》一书,是我在阅读该书的笔记和练习。分享给大家,希望可以帮助C++开发者快速了解多线程。章节与原书类似,只保留关键概念与代码。以下内容均为个人理解,如有错误,参考原作。

1 概念与入门

1.1 什么是并发

        简单来说就是同时进行。

1.2 多进程并发

        并发分为线程并发与进程并发。

1.3 并发(concurrency)与并行(parallelism)

        两者概念存在很大的重合,并行的关注在于同时进行,并发关注的是同时响应。

        两个词汇来理解:并行计算,并发响应。

1.4 为什么使用并发

        关注分离与执行分离。(在后面章节会详细解释这个内容)

1.5 并发与多线程

        c++ 通过多线程实现并发。

1.6 开始编程

        最简单的例子

#include <iostream>
#include <thread>

void hello()
{
    std::cout << “hello,concurrent World\n”;
}

int main
{
    std::thread t(hello);
    t.join();
}

2 管理线程

2.1 发起一个线程

c的函数形式:

void a_thread_task(){};
std::thread my_thread(a_thread_task());

c++类的形式:(C++操作符重载)

class class_thread_task
{
public:
    void operator()() const
    {
        do_something();
    }

}

class_thread_task my_thread_task;
std::thread my_thread(my_thread_task);

补充:令人迷惑的C++:

无法正确编译

std::thread my_thread(class_thread_task());

正确的编译:

std::thread my_thread((class_thread_task()))
std::thread my_thread{class_thread_task()}

更简单的写法:(lambda表达式)

std::thread my_thread([]{do_something();do_something_else();});

补充:使用类中的某个方法作为线程的任务

class class_thread_task
{
public:
    do_something();
}

class_thread_task my_thread_task;
std::thread my_thread(&class_thread_task::do_something,&my_thread_task);

等待一个线程执行结束 

struct function
{
    int& i;
    function(int& _i):i(_i){};
    void operator()()
    {
        for(unsigned j=0;j<10000;++j)
        {
            do_something(i);
        }
    }
}
void oops()
{
    int i = 0;
    function my_function(i);
    std::thread my_thread(my_function);
    my_thread.detach();
}

        使用 detach() 将导致未定义的行为。

        使用 join() 等待线程结束,使用joinable()可查询当前线程是否结束。

    my_thread.join();

        使用RAII形式来等待一个线程的结束(RAII:资源获取就是初始化)

class thread_guard
{
    std::thread& t;
public:
    explicit thread_guard(std::thread& t_):
        t(t_)
        {}
    ~thread_guard()
    {
        if(t.joinable())
        {
            t.join();
        }
    }
    thread_guard(thread_guard const&)=delete;
    thread_guard& operator=(thread_guard const&)=delete;
};
 
struct function;
void f()
{
    int i = 0;
    function my_function(i);
    std::thread t(mu_function);
    thread_guard g(t);
    
    other_things_but_not_immediately_return();

}

线程后台运行

std::thread t(do_something);
t=detach();
assert(!t.joinable());

2.2 向线程传递参数

        

附录

        更多的线程间通信组件,你可以使用boost库。        记录:如何使用C++ boost中的多线程工具?_达达达达尔文~的博客-CSDN博客作为C语言的开发者,我会使用POSIX作为使用多线程的工具。现在,我使用C++11进行开发, 当然C++11提供了线程接口,但是还不够,我需要一些消息中间件,来实现异步操作。不重复造轮子,那么,跟我来吧。https://blog.csdn.net/qq_18826027/article/details/127341698?csdn_share_tail=%7B%22type%22%3A%22blog%22%2C%22rType%22%3A%22article%22%2C%22rId%22%3A%22127341698%22%2C%22source%22%3A%22qq_18826027%22%7D

        

2022/10/10

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值