《C++并发编程实战》读书笔记1---多线程基本使用

本文详细介绍了C++11多线程标准库的基本函数使用方法和多线程编程注意事项,包括构造函数、join、detach、move、hardware_concurrency、get_id等核心函数的应用,以及如何正确处理线程生命周期、参数传递等问题。

这本书,是针对C++11的多线程标准库的一本书。

书的作者便是C++这个库的作者,读了第二章,作者对于这个库确实是娓娓道来,另外作者也同时会给出一些并发编程的注意事项。

本帖的结构如下

1.基本函数使用

2.多线程编程注意事项


1.基本函数使用


①constructor

使用一个函数,或者是一个callable object来初始化一个thread 对象。

实际就是associate一个thread对象和一个thread of execution,便能够开启一个线程了。

当然你也可以声明一个thread对象而不对其associate,这个时候有些方法就不能执行。


注:(1)如果和thread 对象绑定的execution函数有参数,那么也是通过associate时,一同传入的。

如果thread对象绑定的execution函数有返回值,那么可以通过传入一个引用,或者指针将返回值,传递出来。

当然对于返回值,后面章节会有其他解决办法。

(2)一旦一个thread对象,绑定了execution函数,在其线程终止之前必须要对其进行处理。

不能使其在开启这个thread的进程结束之后,还在运行。否则系统会调用std::thread::terminate()出错。

解决办法有两个A。join声明由创建它的程序来回收。B。detach表示将其run in background,最后系统回收。


②join

join兼有等待某个thread结束与回收其资源的作用。

某个associate的对象,只能join一次,可以通过函数std::thread::joinable来判定。

③detach

设置,该线程与这个进程内的其他线程无关了。是run in background。

但是若这个线程的进程结束,这个线程也会被终止。

某个associate了execution function的对象,也只能detach一次。可以用joinable来判定。

注:return,exit都是结束进程。结束线程可以用UNIX的thread_cancel

④std::move

这个函数可以显式转移线程的拥有权,线程对象不能赋值,但是可以转移。

相当于,转移那个associate关系。被move的thread 对象就没有绑定的execution function了。

⑤hardware_concurrency

注意到这是一个static方法,即类方法。

可以返回这台主机的硬件并发数,通俗地讲就是内核数量。

⑥get_id()以及this_thread::get_id()

返回线程的id,返回的id类型是std::thread::id类型的。

可以相互比较大小,如果两个大小相同,他们就是相同的thread。

必须要associate execution function的thread object才有有意义的数字thread id。返回没有associate的,会显示没有绑定,但不会终止程序。


2.多线程编程注意事项

线程associate的时候,可以像该execution function传递参数,这是个值传递,也能std::ref传递引用,或者传递指针。

但是如果是后面两者,最重要的就是要注意,你传递的东西指向的变量,会不会在函数运行的时候,已经销毁了。

比如你是在一个局部函数里面建立子进程,然后传递给了子进程局部函数的变量,可能传递的参数还没有赋值原来的就失效了。

void f(int i,std::string const& s);

void oops(int some_param)
{
char buffer[1024];
sprintf(buffer, "%i",some_param);
std::thread t(f,3,buffer);
t.detach();
}


比如这个buffer参数就是,传递一个buffer指针,但是execution function也许还没有来地及存下来,oops就已经退出,那么buffer便失效了。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值