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

公司做网站需要给百度交钱吗贵州seo技术培训

公司做网站需要给百度交钱吗,贵州seo技术培训,服务外包公司是干什么的,河北建设工程信息网可登录中项网在工作中看到了如下代码,代码基于 std::thread 封装了一个 Thread 类。Thread 封装了业务开发中常用的接口,比如设置调度策略,设置优先级,设置线程名。如下代码删去了不必要的代码,只保留能说明问题的代码。从代码实现…

在工作中看到了如下代码,代码基于 std::thread 封装了一个 Thread 类。Thread 封装了业务开发中常用的接口,比如设置调度策略,设置优先级,设置线程名。如下代码删去了不必要的代码,只保留能说明问题的代码。从代码实现上来看,我们看不出什么问题,创建一个线程,第一个形参是线程的入口函数,后边的传参是线程入口函数的参数列表。

class Thread {
public:template <class Function, class... Args>Thread(Function &&f, Args &&...args) noexcept: internal_{[func = std::forward<Function>(f), &args...]() {func(args...);}}{}private:std::thread internal_;
};

Thread 类在大部分使用场景下是没问题的,比如下面的使用方式,创建了一个线程,线程中是一个死循环,每隔一秒打印一次 "thread running",可以正常工作。

#include <stdio.h>
#include <unistd.h>
#include <memory>
#include <thread>
#include <vector>class Thread {
public:template <class Function, class... Args>Thread(Function &&f, Args &&...args) noexcept: internal_{[func = std::forward<Function>(f), args...]() {func(args...);}}{}private:std::thread internal_;
};void func() {while (1) {printf("thread running\n");sleep(1);}
}int main() {Thread *t = new Thread(func);sleep(100);return 0;
}

1 问题现象

在下边这个使用场景下,就能暴露出来 Thread 的问题。

如下代码中连续创建了 8 个线程,线程的入口函数是 func(),func() 的形参是 Obj 对象,Obj 中的成员 i_  分别取值 0 ~ 7。

#include <stdio.h>
#include <unistd.h>
#include <iostream>
#include <memory>
#include <thread>
#include <vector>class Thread {
public:template <class Function, class... Args>Thread(Function &&f, Args &&...args) noexcept: internal_{[func = std::forward<Function>(f), &args...]() {func(args...);}}{}private:std::thread internal_;
};class Obj {
public:Obj(int i) {i_ = i;std::cout << "Obj(), i: " << i_ << std::endl;}Obj(const Obj &obj) {i_ = obj.i_;std::cout << "copy constructor, i: " << i_ << std::endl;}~Obj() {std::cout << "~Obj(), i: " << i_ << std::endl;}int i_;};void func(Obj obj) {printf("                in thread, i: %d\n", obj.i_);
}int main() {std::vector<Thread *> threads;int i = 0;for (i = 0; i < 8; i++) {printf("    out thread, i: %d\n", i);Obj obj(i);auto tmp = new Thread(func, obj);printf("after create thread %d\n", i);threads.emplace_back(tmp);// sleep(2);}sleep(100);return 0;
}

上边的代码编译之后,运行结果如下所示。我们的预期是在 func() 中的打印分别是 0 ~ 7,每个数字打印一次。但实际的打印结果是有重复的,如下图所示,2 有重复的,7 也有重复的。

root@wangyanlong-virtual-machine:/home/wyl/cpp# ./a.outout thread, i: 0
Obj(), i: 0
after create thread 0
~Obj(), i: 0out thread, i: 1
Obj(), i: 1
after create thread 1
~Obj(), i: 1out thread, i: 2
Obj(), i: 2
copy constructor, i: 2in thread, i: 2
~Obj(), i: 2
copy constructor, i: 2in thread, i: 2
~Obj(), i: 2
after create thread 2
~Obj(), i: 2out thread, i: 3
Obj(), i: 3
copy constructor, i: 2in thread, i: 2
~Obj(), i: 2
copy constructor, i: 3in thread, i: 3
~Obj(), i: 3
after create thread 3
~Obj(), i: 3out thread, i: 4
Obj(), i: 4
after create thread 4
~Obj(), i: 4out thread, i: 5
Obj(), i: 5
copy constructor, i: 4
after create thread 5
~Obj(), i: 5out thread, i: 6
Obj(), i: 6in thread, i: 4
~Obj(), i: 4
copy constructor, i: 5in thread, i: 5
~Obj(), i: 5
after create thread 6
~Obj(), i: 6out thread, i: 7
Obj(), i: 7
copy constructor, i: 7in thread, i: 7
~Obj(), i: 7
after create thread 7
~Obj(), i: 7
copy constructor, i: 7in thread, i: 7
~Obj(), i: 7

上边的代码把 sleep(2) 注释打开,打印结果是符合预期的。

或者将 main() 中的 Thread() 改成 std::thread,打印结果也是符合预期的,说明这种使用方式是符合 c++ 规范的。

2 问题分析

导致问题的原因有以下几个方面:

(1)线程的构造函数入参是右值引用,这个右值引用的生命周期在构造函数返回的时候已经结束了。右值引用,指向一个临时的存储空间,在反复创建 8 个线程期间,8 个右值引用指向的是同一块内存空间,后边的值会将前边的值覆盖。

(2)线程构造函数中,std::thread 的回调函数是一个 lambda 表达式,lambda 表达式中引用捕获了 args。

(3)在 Thread 构造函数中创建了线程,但是线程并不是立即执行的,从创建到真正执行是有一段时间的延迟。这样当线程真正运行的时候,再从 args 引用里边读取数据,取出来的是这块内存最新的数据,属于这个线程的数据已经被覆盖。

3 问题修改

引用捕获改成值捕获

如下代码,在 Thread() 构造函数中的 lambda 表达式对 args 的引用捕获改成值捕获。

#include <stdio.h>
#include <unistd.h>
#include <iostream>
#include <memory>
#include <thread>
#include <vector>class Thread {
public:template <class Function, class... Args>Thread(Function &&f, Args &&...args) noexcept: internal_{[func = std::forward<Function>(f), args...]() {func(args...);}}{}private:std::thread internal_;
};class Obj {
public:Obj(int i) {i_ = i;std::cout << "Obj(), i: " << i_ << std::endl;}Obj(const Obj &obj) {i_ = obj.i_;std::cout << "copy constructor, i: " << i_ << std::endl;}~Obj() {std::cout << "~Obj(), i: " << i_ << std::endl;}int i_;};void func(Obj obj) {printf("                in thread, i: %d\n", obj.i_);
}int main() {std::vector<Thread *> threads;int i = 0;for (i = 0; i < 8; i++) {printf("    out thread, i: %d\n", i);Obj obj(i);auto tmp = new Thread(func, obj);printf("after create thread %d\n", i);threads.emplace_back(tmp);// sleep(2);}sleep(100);return 0;
}
http://www.hkea.cn/news/561597/

相关文章:

  • 免费网站建设方案锦绣大地seo官网
  • 电子商务的网站建设牛排seo系统
  • 资源收费网站怎么做网站快速优化排名官网
  • 招标网哪个网站信息可靠百度站长工具网站
  • 郑州七七网站建设互联网推广公司
  • 佛山做外贸网站代理商百度收录技术
  • 公司网站建设需要什么今日热搜第一名
  • 烟台建设企业网站网站快速收录入口
  • 怎么做繁体字网站网络营销公司注册找哪家
  • 做ppt介绍网站吗网站搜索引擎优化工具
  • 深圳网站建设有没有市场百度搜索推广的五大优势
  • 网站建设好的图片百度互联网营销
  • 柳州网站制作公司seo优化什么意思
  • 网站建设做的好的公司淘宝关键词优化怎么弄
  • 手机网站用模版方象科技的企业愿景
  • 沈阳网站建设技术公司排名公司市场营销策划方案
  • 赣州网站建设怎样石家庄最新消息
  • 公司注册地址和经营地址不一致可以吗长春seo招聘
  • 好的做问卷调查的网站好推广有奖励的app平台
  • 有专业设计网站吗百度指数与百度搜索量
  • 网站的整体结构百度云网盘资源搜索引擎入口
  • 咸阳网站建设哪家专业杭州优化公司在线留言
  • 地板网站建设门户网站
  • 新增备案网站负责人人工智能培训心得体会
  • 帮境外赌场做网站是否有风险百度企业号
  • 网站换了服务器百度seo排名优化公司哪家好
  • 海南网站建设制作网络营销效果评估
  • 飞阳建设网站上海广告公司
  • 营销网站导航栏常见网站搜索排名靠前
  • 深圳市政府网站官网百度地图疫情实时动态