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

wordpress 添加新页面跳转seo咨询价格找推推蛙

wordpress 添加新页面跳转,seo咨询价格找推推蛙,wordpress文章中插入代码,c 做网站如何调用dll一、理解线程id 首先我们要知道给用户提供的线程id不是内核里面LWP(轻量级进程id),而是pthread库自己维护的一个唯一值。 我们理解为什么线程id不是内核里面LWP,因为用户没有权限使用内核里面的字段,那是专门给OS管理…

一、理解线程id

首先我们要知道给用户提供的线程id不是内核里面LWP(轻量级进程id),而是pthread库自己维护的一个唯一值。

我们理解为什么线程id不是内核里面LWP,因为用户没有权限使用内核里面的字段,那是专门给OS管理线程用的。

但是为什么要pthread库来帮我们用户维护用户级线程id呢?

因为Linux内核根本就不存在线程的概念,所谓用户口中的线程在Linux眼里就是轻量级进程,之后理解不在赘述具体参考文章http://t.csdnimg.cn/jTGGP中pthread库介绍。

内核级理解:

所以我们清楚的看到返回给用户的线程id就是一个线程控制块在虚拟地址空间的起始位置。

类比FILE对象,其实就在c标准库中,返回的是FILE*就是地址。

所以 pthread_join() 函数就是通过tid找到存在虚拟地址空间中的线程结构体对象,把里面的退出信息拷贝出来返回。

操作系统内示意图:

二、简单封装原生线程库

thread.hpp

#pragma once
#include<pthread.h>
#include<iostream>
#include<string>
using namespace std;namespace Thread
{//线程执行方法typedef void(*func_t)(const string& name);class Thread{public://线程执行方法void Excute(){cout << _name << " is running" << endl; _isrunning = true;_func(_name);_isrunning = false;}public:Thread(const string& name, func_t func):_name(name),_func(func){cout << "create " << name << " done" << endl; }//线程执行回调方法//设成静态方法,函数就不会自带this指针,类型就匹配上了//但是此时就无法调类的回调函数,在create函数中传参即可static void* ThreadRoutine(void* args){//获得当前线程对象Thread* self = static_cast<Thread*>(args);//调用线程执行方法self->Excute();return nullptr;}bool Start(){int n = ::pthread_create(&_tid, nullptr, ThreadRoutine, this);if (n != 0)return false;return true;}string Status(){if(_isrunning) return "running";else return "sleep";}string GetName(){return _name;}void Stop(){if(_isrunning = true){::pthread_cancel(_tid);_isrunning = false;cout << _name << " stop" << endl; }}void Join(){if(!_isrunning){::pthread_join(_tid, nullptr);cout << _name << " join done" << endl; }}~Thread(){}private:string _name;pthread_t _tid;bool _isrunning = false;func_t _func; //线程执行的回调函数};
}

main.cc

#include<iostream>
#include"thread.hpp"
#include<unistd.h>
#include<vector>
using namespace Thread;
using namespace std;void Print(const string& name)
{int cnt = 0;while(1){cout << name << " is running, cnt: " << cnt++ << endl;sleep(1);}
}const int num = 10;int main()
{//创建线程vector<Thread::Thread> threads;for(int i = 0; i < num; i++){string name = "thread-" + to_string(i + 1);threads.emplace_back(name, Print);sleep(1);}//统一启动for(auto& thread : threads){thread.Start();}sleep(10);//统一结束for(auto& thread : threads){thread.Stop();}//统一回收for(auto& thread : threads){thread.Join();}// Thread::Thread t("thread-1", Print);// t.Start();// cout << t.GetName() << " status: " << t.Status() << endl;// sleep(10);// cout << t.GetName() << " status: " << t.Status() << endl;// t.Stop();// sleep(1);// cout << t.GetName() << " status: " << t.Status() << endl;// t.Join();// cout << "join done" << endl;return 0;
}

三、线程的局部存储

对于一个全局变量,一个进程中任意线程都能进行修改,另外的线程也可以看到变化,因为线程共享进程的大部分数据。

在LInux中我们用 __thread修饰全局变量(只能修饰内置类型)就能让全局变量在所有线程各有一份,地址也不同,这就能实现每一个线程都有属于自己的变量,这就是线程的局部存储。

http://www.yidumall.com/news/33293.html

相关文章:

  • 网站备案都需要什么近期热点新闻
  • 通化市建设局网站ios aso优化工具
  • 展览网站模板大全经典品牌推广文案
  • 网站建设公司发展谷歌seo外链平台
  • 什么网站吸引流量甘肃省seo关键词优化
  • wordpress标签静态化seo视频教程汇总
  • 吉安网站制作公司排名产品网站推广
  • 新闻网站建设规划书网球新闻最新消息
  • 企业交易平台的网站制作多少钱优秀的营销策划案例
  • 承德建设厅网站百度移动应用
  • 政府门户网站建设报道广告联盟接单平台
  • 网站建设 站内页面连接网络推广公司深圳
  • 威联通如何做网站搜狗收录提交
  • 服务器搭建网站空间外贸独立站怎么做
  • 新网 如何建设网站徐州做网站的公司
  • 做视频周边的网站网站优化公司排名
  • 网站建设 银川百度sem认证
  • 建网站的宽带多少钱微营销官网
  • 公安门户网站建设中的问题站长工具查询网
  • 对外贸营销型网站建设的几点建议正规的关键词优化软件
  • 网站开发过程的分工武汉百度seo网站优化
  • 网站的关键词谷歌排名算法
  • 福建做网站seo搜索引擎优化是通过优化答案
  • 长阳网站建设sem账户托管公司
  • 网站开发商官网今天
  • 做购票系统网站丈哥seo博客
  • 用框架做网站如何居中信息推广
  • 无锡网站设计公司排名百度搜索推广流程
  • 搜索引擎作弊的网站有哪些网站发帖推广平台
  • 做面膜的网站廊坊网站