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

广东省交通建设监理检测协会网站找公司做网站需要注意

广东省交通建设监理检测协会网站,找公司做网站需要注意,个人想注册一个小公司,wordpress缓存清除文章目录 一、线程池二、线程安全的单例模式1.单例模式的特点2.饿汉实现方式和懒汉实现方式3.懒汉方式实现单例模式(线程安全版本) 三、STL,智能指针和线程安全四、常见的各种锁五、读者写者问题1.读写锁2.读写锁接口 一、线程池 线程池:一种线程使用模式。线程过多会带来调度… 文章目录 一、线程池二、线程安全的单例模式1.单例模式的特点2.饿汉实现方式和懒汉实现方式3.懒汉方式实现单例模式(线程安全版本) 三、STL,智能指针和线程安全四、常见的各种锁五、读者写者问题1.读写锁2.读写锁接口 一、线程池 线程池:一种线程使用模式。线程过多会带来调度开销进而影响缓存局部性和整体性能。而线程池维护着多个线程等待着监督管理者分配可并发执行的任务。这避免了在处理短时间任务时创建与销毁线程的代价。线程池不仅能够保证内核的充分利用还能防止过分调度。可用线程数量应该取决于可用的并发处理器、处理器内核、内存、网络sockets等的数量。 线程池的应用场景 1.需要大量的线程来完成任务且完成任务的时间比较短。 WEB服务器完成网页请求这样的任务使用线程池技术是非常合适的。因为单个任务小而任务数量巨大你可以想象一个热门网站的点击次数。 但对于长时间的任务比如一个Telnet连接请求线程池的优点就不明显了。因为Telnet会话时间比线程的创建时间大多了。 2.对性能要求苛刻的应用比如要求服务器迅速响应客户请求。 3.接受突发性的大量请求但不至于使服务器因此产生大量线程的应用。突发性大量客户请求在没有线程池情况下将产生大量线程虽然理论上大部分操作系统线程数目最大值不是问题短时间内产生大量线程可能使内存到达极限出现错误. 线程池的种类 线程池示例 1.创建固定数量线程池循环从任务队列中获取任务对象 2.获取到任务对象后执行任务对象中的任务接口 Thread.hpp 以下是自己封装实现的线程 #pragma once#include iostream #include string #include functional #include cstring #include cassert #include pthread.hnamespace ThreadNs {typedef std::functionvoid *(void *) func_t;const int num 1024;class Thread{private:static void *start_routine(void *args){Thread *td static_castThread *(args);return td-callback();}public:Thread(){char buffer[num];snprintf(buffer, sizeof buffer, thread-%d, threadnum);_name buffer;}void start(func_t func, void *args){_func func;_args args;int n pthread_create(_tid, nullptr, start_routine, this);}void join(){int n pthread_join(_tid, nullptr);assert(n 0);(void)n;}std::string threadname(){return _name;}void *callback(){return _func(_args);}~Thread(){}private:std::string _name;void *_args;func_t _func;pthread_t _tid;static int threadnum;};int Thread::threadnum 1; }LockGuard.hpp 以下是自己封装实现的RAII风格的锁 #pragma once#include cassert #include pthread.hclass Mutex { public:Mutex(pthread_mutex_t *lock_p nullptr): _lock_p(lock_p){}void lock(){if (_lock_p){int n pthread_mutex_lock(_lock_p);assert(n 0);(void)n;}}void unlock(){if (_lock_p){int n pthread_mutex_unlock(_lock_p);assert(n 0);(void)n;}}~Mutex(){}private:pthread_mutex_t *_lock_p; };class LockGuard { public:LockGuard(pthread_mutex_t *mutex) : _mutex(mutex){_mutex.lock();}~LockGuard(){_mutex.unlock();}private:Mutex _mutex; };Task.hpp 以下代码是用于任务的处理 #pragma once#include iostream #include string #include functionalclass Task { public:typedef std::functionint(int, int, char) func_t;// using func_t std::functionint(int, int, char);public:Task(){}Task(int x, int y, char op, func_t func): _x(x), _y(y), _op(op), _callback(func){}std::string operator()(){int result _callback(_x, _y, _op);char buffer[1024];snprintf(buffer, sizeof buffer, %d %c %d %d, _x, _op, _y, result);return buffer;}std::string toTaskString(){char buffer[1024];snprintf(buffer, sizeof buffer, %d %c %d ?, _x, _op, _y);return buffer;}private:int _x;int _y;char _op;func_t _callback; };const std::string oper -*/%;int calculate(int x, int y, char op) {int result 0;switch (op){case :result x y;break;case -:result x - y;break;case *:result x * y;break;case /:{if (y 0){std::cerr div zero error std::endl;return -1;}elseresult x / y;}break;case %:{if (y 0){std::cerr mod zero error std::endl;return -1;}elseresult x % y;}break;default:std::cerr 请输入正确的操作符 std::endl;break;}return result; } ThreadPool.hpp #pragma once#include Thread.hpp #include LockGuard.hppusing namespace ThreadNs;#include vector #include queue #include iostreamconst int gnum 3;template class T class ThreadPool;template class T class ThreadData { public:ThreadData(ThreadPoolT *tp, const std::string threadname): _threadpool(tp), _threadname(threadname){}~ThreadData(){}public:ThreadPoolT *_threadpool;std::string _threadname; };template class T class ThreadPool { private:static void* handleTask(void* args){ThreadDataT* td static_castThreadDataT*(args);while(true){T t;{LockGuard lockguard(td-_threadpool-mutex());while(td-_threadpool-isQueueEmpty()){td-_threadpool-threadWait();}t td-_threadpool-pop();}std::cout td-_threadname 获取了一个任务 t.toTaskString() 并处理完成结果是 t() std::endl;}delete td;return nullptr;} public:bool isQueueEmpty() {return _task_queue.empty(); }void threadWait() { pthread_cond_wait(_cond,_mutex); }void lockQueue() {pthread_mutex_lock(_mutex); }void unlockQueue() {pthread_mutex_unlock(_mutex); }T pop(){T t _task_queue.front();_task_queue.pop();return t;}pthread_mutex_t* mutex() { return _mutex; } public:ThreadPool(const int num gnum): _num(num){pthread_mutex_init(_mutex, nullptr);pthread_cond_init(_cond, nullptr);for (int i 0; i _num; i){_threads.push_back(new Thread());}}public:void run(){for (const auto iter : _threads){ThreadDataT *td new ThreadDataT(this, iter-threadname());iter-start(handleTask, td);std::cout iter-threadname() start... std::endl;}}void push(T in){LockGuard lockguard(_mutex);_task_queue.push(in);pthread_cond_signal(_cond);}~ThreadPool(){pthread_mutex_destroy(_mutex);pthread_cond_destroy(_cond);for (const auto t : _threads){delete t;}}private:int _num;std::vectorThread * _threads;std::queueT _task_queue;pthread_mutex_t _mutex;pthread_cond_t _cond; }; main.cc #include Task.hpp #include ThreadPool.hpp#include memory #include unistd.hint main() {std::unique_ptrThreadPoolTask tp(new ThreadPoolTask());tp-run();int x, y;char op;while (1){std::cout 请输入数据1# ;std::cin x;std::cout 请输入数据2# ;std::cin y;std::cout 请输入你要进行的运算#;std::cin op;Task t(x, y, op, calculate);tp-push(t);sleep(1);}return 0; }二、线程安全的单例模式 IT行业这么火, 涌入的人很多. 俗话说林子大了啥鸟都有. 大佬和菜鸡们两极分化的越来越严重. 为了让菜鸡们不太拖大佬的后腿, 于是大佬们针对一些经典的常见的场景, 给定了一些对应的解决方案, 这个就是 设计模式 1.单例模式的特点 某些类, 只应该具有一个对象(实例), 就称之为单例.例如一个男人只能有一个媳妇. 在很多服务器开发场景中, 经常需要让服务器加载很多的数据 (上百G) 到内存中. 此时往往要用一个单例的类来管理这些数据 2.饿汉实现方式和懒汉实现方式 我们以洗碗的例子来说明懒汉模式和饿汉模式 吃完饭, 立刻洗碗, 这种就是饿汉方式. 因为下一顿吃的时候可以立刻拿着碗就能吃饭。吃完饭, 先把碗放下, 然后下一顿饭用到这个碗了再洗碗, 就是懒汉方式。 懒汉方式最核心的思想是 “延时加载”. 从而能够优化服务器的启动速度 饿汉方式实现单例模式 template class T class Singleton {static T data; public:static T* GetInstance() {return data;} };只要通过 Singleton 这个包装类来使用 T 对象, 则一个进程中只有一个 T 对象的实例 懒汉方式实现单例模式 template class T class Singleton {static T* inst; public:static T* GetInstance(){if (inst NULL) {inst new T();}return inst; } };存在一个严重的问题, 线程不安全。第一次调用 GetInstance 的时候, 如果两个线程同时调用, 可能会创建出两份 T 对象的实例但是后续再次调用, 就没有问题了 3.懒汉方式实现单例模式(线程安全版本) // 懒汉模式, 线程安全 template class T class Singleton {volatile static T* inst; // 需要设置 volatile 关键字, 否则可能被编译器优化.static std::mutex lock; public:static T* GetInstance(){if (inst NULL){ // 双重判定空指针, 降低锁冲突的概率, 提高性能.lock.lock(); // 使用互斥锁, 保证多线程情况下也只调用一次 new.if (inst NULL){inst new T();}lock.unlock();}return inst;} };注意事项: 1.加锁解锁的位置 2.双重 if 判定, 避免不必要的锁竞争 3.volatile关键字防止过度优化 三、STL,智能指针和线程安全 STL中的容器是否是线程安全的? 不是。原因是, STL 的设计初衷是将性能挖掘到极致, 而一旦涉及到加锁保证线程安全, 会对性能造成巨大的影响. 而且对于不同的容器, 加锁方式的不同, 性能可能也不同(例如hash表的锁表和锁桶).因此 STL 默认不是线程安全. 如果需要在多线程环境下使用, 往往需要调用者自行保证线程安全。 智能指针是否是线程安全的? 对于 unique_ptr, 由于只是在当前代码块范围内生效, 因此不涉及线程安全问题. 对于 shared_ptr, 多个对象需要共用一个引用计数变量, 所以会存在线程安全问题. 但是标准库实现的时候考虑到了这个问题, 基于原子操作(CAS)的方式保证 shared_ptr 能够高效, 原子的操作引用计数. 四、常见的各种锁 悲观锁在每次取数据时总是担心数据会被其他线程修改所以会在取数据前先加锁读锁写锁行锁等当其他线程想要访问数据时被阻塞挂起。 乐观锁每次取数据时候总是乐观的认为数据不会被其他线程修改因此不上锁。但是在更新数据前会判断其他数据在更新前有没有对数据进行修改。主要采用两种方式版本号机制和CAS操作。 CAS操作当需要更新数据时判断当前内存值和之前取得的值是否相等。如果相等则用新值更新。若不等则失败失败则重试一般是一个自旋的过程即不断重试。 自旋锁公平锁非公平锁。 五、读者写者问题 1.读写锁 在编写多线程的时候有一种情况是十分常见的。那就是有些公共数据修改的机会比较少。相比较改写它们读的机会反而高的多。通常而言在读的过程中往往伴随着查找的操作中间耗时很长。给这种代码段加锁会极大地降低我们程序的效率。那么有没有一种方法可以专门处理这种多读少写的情况呢 有那就是读写锁。 2.读写锁接口 设置读写优先 int pthread_rwlockattr_setkind_np(pthread_rwlockattr_t *attr, int pref); pref 共有 3 种选择 PTHREAD_RWLOCK_PREFER_READER_NP (默认设置) 读者优先可能会导致写者饥饿情况 PTHREAD_RWLOCK_PREFER_WRITER_NP 写者优先目前有 BUG导致表现行为和 PTHREAD_RWLOCK_PREFER_READER_NP 一致 PTHREAD_RWLOCK_PREFER_WRITER_NONRECURSIVE_NP 写者优先但写者不能递归加锁初始化 int pthread_rwlock_init(pthread_rwlock_t *restrict rwlock,const pthread_rwlockattr_t *restrict attr);销毁 int pthread_rwlock_destroy(pthread_rwlock_t *rwlock);加锁和解锁 int pthread_rwlock_rdlock(pthread_rwlock_t *rwlock); int pthread_rwlock_wrlock(pthread_rwlock_t *rwlock); int pthread_rwlock_unlock(pthread_rwlock_t *rwlock);对于读者写者问题我们了解一下即可做实现的现象并不明显理解其原理即可。
http://www.zqtcl.cn/news/687784/

相关文章:

  • 永年区住房和城乡建设局网站网站后台文档
  • 网站备案授权书wordpress教程 页面
  • 深圳网站开发制作安徽全网优化
  • 陕西建设局网站appcms程序怎么做网站
  • 石家庄城乡建设厅网站牡丹江百度推广
  • 网站建设源代码 费用事件网站推广
  • 购物网站开发文献综述潮汕网站建设
  • 做五金生意什么网站做比较好网站建设市场规模
  • 网站跟app的区别是什么网络搭建结构图
  • 淘宝网站怎么做视频教程山西推广型网站开发
  • 杭州开发网站2018主流网站建设语言
  • 杂志社网站建设方案书响应式网站服务
  • 青岛网站开发建设农村建设有限公司网站
  • 做水晶接单在哪个网站接php做购物网站怎么样
  • 网站内部结构优化网页设计网站搭建
  • 杭州公司建设网站网络营销是一种什么营销
  • 事业单位网站建设费科目定西市小企业网站建设
  • 温州网站推广哪家好网站开发所遵循的
  • 没有网站做APP公司logo设计公司logo设计
  • 网站建设在哪个软件下做中国最大的现货交易平台
  • 西宁做网站公司电话加强局网站建设
  • 佛山做企业网站公司做贸易做个外贸网站有必要吗
  • 南昌制作网站的公司wordpress 分享到插件
  • 大型网站怎样做优化PHP站长工具怎么用
  • 响应式模板网站建设营销型网站建设怎么收费
  • 夺宝网站开发全网seo优化电话
  • 宁夏建设工程招标投标信息管理中心网站广告多的网站
  • c 网站做死循环北京响应式的网站设计
  • 手机门户网站建设莱芜雪野湖国际会议中心酒店
  • 男人女人做那事网站vue加wordpress