当前位置: 首页 > news >正文

公司网站建设的系统功能需求网站快速收录技术

公司网站建设的系统功能需求,网站快速收录技术,知名企业招聘信息,公众号版网站建设多线程编程使我们的程序能够同时执行多项任务。 在C11以前,C没有标准的多线程库,只能使用C语言中的pthread,在C11之后,C标准库中增加了thread类用于多线程编程。thread类其实是对pthread的封装,不过更加好用&#xff…

多线程编程使我们的程序能够同时执行多项任务。

在C++11以前,C++没有标准的多线程库,只能使用C语言中的pthread,在C++11之后,C++标准库中增加了thread类用于多线程编程。thread类其实是对pthread的封装,不过更加好用,现在已经广泛用于C++多线程编程。

C++11的多线程库主要包含<thread> <mutex> <atomic> <condition_variable> <future>等头文件,这篇文章只要整理记录<thread>头文件的内容。

<thread>头文件中主要就是定义了thread类,thread主要的public接口有以下几个:

1. 构造函数---创建线程

thread类提供了默认构造函数,移动构造函数和一般构造函数,并且禁止编译器生成拷贝构造函数,以及重载 = 操作符,这俩是不允许的。

三种构造函数的原型:

//默认构造
thread() noexcept = default;
//移动构造
thread(thread&& __t) noexcept;
//一般构造
template<typename _Callable, typename... _Args>
explicit thread(_Callable&& __f, _Args&&... __args);

最常用的是一般构造函数,使用一般构造函数创建线程,需要传入一个入口函数,和这个函数需要的参数,说白了就是告诉被创建的线程要去做什么事情,如果这个线程有形参,需要跟在后边一起传入。

#include <unistd.h>
#include <thread>void fun(int num) {while (num--){sleep(1);std::cout << "thread th  " << num << std::endl;}
}int main() {std::thread th(fun, 3);if (th.joinable()){th.join();}}

上边的例子中std::thread th(fun, 3);创建了一个线程,线程的入口函数就是void fun(int num)这个函数,开启线程的时候,同时需要把fun需要的参数传进去。

2. get_id

每个线程都有一个唯一的标识符,即线程id,使用get_id函数可以获取线程的id;

get_id返回一个类型为std::thread::id的对象,这是一个类,它对<<运算符进行了重载,所以可以直接用std::cout打印出来。

#include <unistd.h>
#include <thread>void fun(int num) {while (num--){
//        sleep(1);
//        std::cout << "thread th  " << num << std::endl;}
}
int main() {std::thread th(fun, 3);std::cout << th.get_id() << std::endl;std::cout << this_thread::get_id() << std::endl;if (th.joinable()){th.join();}
}

 this_thread是一个命名空间,表示当前线程,当前线程就是main函数所在的主线程,所以thread::get_id()在这里就是主线程的id。

3. join & detach

void join();
void detach();

第一个例子中,线程开启之后,有这样一段代码

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

这段代码意思是等待th线程执行完毕,主线程再继续往下执行。

如果把这段代码注释掉,会得到这样的结果

这是因为th线程尚未执行完毕,主线程就退出了,所以th线程被强行中断了,而且终端会打印一段错误信息(terminate called without an active exception) 。

join 和 detach 是线程两种不同的运行方式:

  • join表示等待,调用后会阻塞当前线程,直到join线程执行完毕,调用者才继续往下执行;
  • detach表示分离,程序不会等待detach线程执行完,且程序退出之后,detach线程由系统接管继续执行。

4. joinable

bool joinable() const noexcept;

在调用join或者detach之前,先判断线程是否joinable,是一个良好的习惯。

从一般构造函数创建的线程,他们的joinable都是ture,可以进行join或者detach,而且,对线程进行join和detah是必要的,这样可以明确告诉程序,该怎么调度这个线程,避免不必要的错误发生。

具体原因可以看这里。

5. 析构函数

~thread()
{if (joinable()){std::terminate();}}

从析构函数可以看出来,如果一个线程在释放的时候还是joinable的,那么整个程序都会退出,这也是为什么线程一定要调用join或者detach的原因,调用了join和detach之后,线程的joinable就为false了。

上边说到join和detach的时候,尝试把join删掉了,确实会导致程序报错。

6. swap

void swap (thread& x) noexcept;

交换两个线程的所有属性。

http://www.yayakq.cn/news/812172/

相关文章:

  • 做网站主页图片一般多少m温州建设学校网站
  • 长沙网站排名优化费用商业网点是什么意思
  • 幸运飞艇网站建设郑州网站建设如何
  • 淄博专业网站建设价格梧州高端网站建设服务
  • 西部数码空间可以做会所网站吗黄石网站建设哪家专业
  • 无锡网站制作方案大连网站开发建站
  • 为什么建设银行网站打不开wordpress空白页面模板
  • 广西建设学院网站湖州微网站建设
  • 织梦制作手机网站模板网站开发步骤规划
  • 自己建的网站能赚钱吗中国建设银行贵州省分行网站
  • 上海网站排名公司网站服务器租用哪家好
  • 整个网站建设中的关键步骤是vi设计公司平台哪个好
  • 织梦可以仿所有网站吗企业管理咨询服务内容
  • 沧州网站建设联系电话平面设计接单攻略电子书
  • 手机网站模版建站平台最便宜
  • 做磁性材料在哪些网站推广比较好c asp.net网站开发书
  • 整站优化深圳网站平台设计费用多少
  • 哈尔滨龙彩做网站多少钱中国最大的软件开发公司
  • 网站内容优化方案手机设计网站
  • 从网站优化之角度出发做网站策划在哪里可以查公司注册信息
  • 浙江鼎兴建设有限公司网站铭誉摄影网站
  • ps国外教程网站网站开发建设专业
  • 怎么做微信里的网页网站链接四川seo推广方案
  • 怎么确认网站是什么语言做的网页制作的公司企业
  • 怎样用模板建一个网站上海网站网络科技有限公司
  • 湖南网站建设公司磐石网络课程网站建设的财务分析
  • 微信网站制作企业常德网站开发
  • 做个人网站要注意什么网站没有被收录原因
  • 莒县网站建设公司关于网站建设的画册
  • 郑州网站建设氵汉狮网络j昆明网站制作公司