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

ps做特效哪个网站好旅游业网站建设

ps做特效哪个网站好,旅游业网站建设,小型网站开发需要什么步骤,2003 建设网站线程池 线程池是一种多线程处理形式&#xff0c;处理过程中它将被提交的任务分配给预先创建好的多个线程中的一个去执行。 线程池的实现 #pragma once #include <pthread.h> #include <vector> #include <string> #include <unistd.h> #include <…

线程池

线程池是一种多线程处理形式,处理过程中它将被提交的任务分配给预先创建好的多个线程中的一个去执行。

线程池的实现

#pragma once
#include <pthread.h>
#include <vector>
#include <string>
#include <unistd.h>
#include <pthread.h>
#include <queue>
#include <functional>
#include "task.hpp"
#include "thread.hpp"
using namespace ThreadModel;
// void test(const std::string &name)
// {//     while (1)
//     {
//         std::cout << name << "is running.." << std::endl;
//         sleep(1);
//     }
// }
const int Default_nums = 3;template <class T>
class ThreadPool
{using func_t = std::function<void(const std::string name)>;private:bool isEmpty(){return _task_queue.size() == 0;}void Sleep(){pthread_cond_wait(&_cond, &_mutex);}void lockQueue(){pthread_mutex_lock(&_mutex);}void wakeUp(){pthread_cond_signal(&_cond);}void wakeUpAll(){pthread_cond_broadcast(&_cond);}void unlockQueue(){pthread_mutex_unlock(&_mutex);}void hadertask(const std::string name){lockQueue();while (true){while (isEmpty() && _isrunning){_sleepnums++;std::cout << name << " star sleep" << std::endl;Sleep();std::cout << name << " awaken" << std::endl;_sleepnums--;}if (isEmpty() && !_isrunning){unlockQueue();std::cout << name << " quit" << std::endl;break;}T t = _task_queue.front();_task_queue.pop();unlockQueue();t();std::cout << t.solve() << std::endl;}}void init(){// 并将调用func时的第一个参数传递给hander函数。func_t func = std::bind(&ThreadPool::hadertask, this, std::placeholders::_1);for (int i = 0; i < _thread_nums; i++){std::string name = "thread-" + std::to_string(i + 1);_threads.emplace_back(name, func);std::cout << name << " init sucess" << std::endl;}}ThreadPool(int thread_nums = Default_nums) : _thread_nums(thread_nums), _sleepnums(0){init();pthread_mutex_init(&_mutex, nullptr);pthread_cond_init(&_cond, nullptr);}public:~ThreadPool(){pthread_cond_destroy(&_cond);pthread_mutex_destroy(&_mutex);}static ThreadPool<T> * GetInstance(int thread_nums = Default_nums){if (_tp == nullptr){pthread_mutex_lock(&_sig_mutx);if (_tp == nullptr){_tp = new ThreadPool(thread_nums);std::cout<<"create instance"<<std::endl;}pthread_mutex_unlock(&_sig_mutx);}std::cout<<"get instance"<<std::endl;return _tp;}void start(){_isrunning = true;std::cout << "threadpool is running:" << std::endl;for (auto &thread : _threads) // 这个引用特别重要// 如果不传引用 thread 出了函数会被销毁 访问name 会出问题{thread.start();}}void equeue(const T &in){// 拿数据和放数据要加锁 因为可能脏读lockQueue();if (_isrunning){_task_queue.push(in);if (_sleepnums > 0){wakeUp();}}std::cout << in.inquiry() << std::endl;unlockQueue();}void stop(){wakeUpAll();std::cout << "threadpool stop" << std::endl;_isrunning = false;}private:std::queue<T> _task_queue;int _thread_nums;std::vector<Thread> _threads;bool _isrunning;int _sleepnums;pthread_mutex_t _mutex;pthread_cond_t _cond;static ThreadPool *_tp;static pthread_mutex_t _sig_mutx;
};
template <class T>
ThreadPool<T> *ThreadPool<T>::_tp = nullptr;template <class T>
pthread_mutex_t ThreadPool<T>::_sig_mutx = PTHREAD_MUTEX_INITIALIZER;

日志类

#pragma once
#include <iostream>
#include <string>
#include <unistd.h>
#include <sys/types.h>
#include <ctime>
#include <stdarg.h>
#include <fstream>
#include <cstring>
#include <pthread.h>
#include "lockerguard.hpp"
// namespace{}
namespace log_ns
{
#define SCREEN_TYPE 1
#define FILE_TYPE 2pthread_mutex_t gmutex = PTHREAD_MUTEX_INITIALIZER;enum level{DEBUG = 1,INFO,WARNNING,ERROR,FATAL};std::string levelToString(int level){switch (level){case DEBUG:return "DEBUG";case INFO:return "INFO";case WARNNING:return "WARNNING";case ERROR:return "ERROR";case FATAL:return "FATAL";default:return "UNKNOW";}}std::string GetCurTime(){time_t now = time(nullptr);struct tm *cur_time = localtime(&now);char buff[128];snprintf(buff, 128, "%d-%02d-%02d %02d:%02d:%02d",cur_time->tm_year + 1900,cur_time->tm_mon + 1,cur_time->tm_mday,cur_time->tm_hour,cur_time->tm_min,cur_time->tm_sec);return buff;}class LogMessage{public:std::string _level;        // 日志等级pid_t _id;                 // 进程号std::string _filename;     // 文件名int _filenumber;           // 行号std::string _cur_time;     // 日志所写时间std::string _message_info; // 日志信息};const char *gfile = "./log.txt";class Log{public:Log(const std::string &logfile = gfile) : _logFile(logfile), _type(SCREEN_TYPE){}void FlushLogToScreen(const LogMessage &lg){printf("[%s][%d][%s][%d][%s] %s",lg._level.c_str(),lg._id,lg._filename.c_str(),lg._filenumber,lg._cur_time.c_str(),lg._message_info.c_str());}void FlushLogToFile(const LogMessage &lg){//std::ofstream out(_logFile, std::ios::app);if (!out.is_open())return;char buff[1024];snprintf(buff, sizeof(buff), "[%s][%d][%s][%d][%s] %s",lg._level.c_str(),lg._id,lg._filename.c_str(),lg._filenumber,lg._cur_time.c_str(),lg._message_info.c_str());out.write(buff, strlen(buff));out.close();}void FlushLog(const LogMessage &lg){LockGuard lockguard(&gmutex);switch (_type){case SCREEN_TYPE:FlushLogToScreen(lg);break;case FILE_TYPE:FlushLogToFile(lg);break;default:break;}}void logMessage(int level, std::string filename, int filenumber, const char *format...){LogMessage lg;lg._level = levelToString(level);lg._filename = filename;lg._filenumber = filenumber;lg._cur_time = GetCurTime();lg._id = getpid();va_list ap;va_start(ap, format);char buff[128];vsnprintf(buff, sizeof(buff), format, ap);va_end(ap);FlushLog(lg);}private:int _type;std::string _logFile;};Log lg;
#define LOG(Level, Format, ...)                                          \do                                                                   \{                                                                    \lg.logMessage(Level, __FILE__, __LINE__, Format, ##__VA_ARGS__); \} while (0)
#define EnableScreen()          \do                          \{                           \lg.Enable(SCREEN_TYPE); \} while (0)
#define EnableFile()          \do                        \{                         \lg.Enable(FILE_TYPE); \} while (0)
}

单例模式

 static ThreadPool<T> * GetInstance(int thread_nums = Default_nums){if (_tp == nullptr){pthread_mutex_lock(&_sig_mutx);if (_tp == nullptr){_tp = new ThreadPool(thread_nums);std::cout<<"create instance"<<std::endl;}pthread_mutex_unlock(&_sig_mutx);}std::cout<<"get instance"<<std::endl;return _tp;}
http://www.yayakq.cn/news/12257/

相关文章:

  • 校园门户网站建设前端移动网站开发
  • 杭州网站搭建小程序平台下载
  • php网站开发淮安招聘网站开发总结经验和教训
  • 做调查的网站推荐公司网站建设需要考虑什么问题
  • 北京网站搭建费用怎样做企业官方网站
  • 建筑钢结构网站什么是网站被黑
  • 什么官网比较容易做网站不用下载就可以登录微信
  • 学校官方网站建设手机网站信任从哪里设置
  • 防城港网站制作北京建设信源咨询有限公司网站
  • 深圳 企业 网站建设哪家好旅游网站建设功能意义
  • 网站和二级目录权重做美食软件视频网站
  • 建站一般要多少钱焦作做网站推广
  • 抄袭别人网站的前端代码合法吗重庆忠县网站建设
  • 济南公众平台网站建设北京百度竞价托管公司
  • 站长做什么网站赚钱爱网站找不到了
  • 如何推广手机网站搜索引擎关键词竞价排名
  • asp双语企业网站源码个人博客网站下载
  • 网站优化seo方案做电商网站公司简介
  • 做网站域名的公司海报设计免费模板
  • 发布网站建设平面设计公司做企业网站
  • 做新闻封面的网站网站建设类的职位
  • 网站防御代理长沙口碑最好的装修公司排名
  • 淮北矿业 集团 工程建设有限责任公司网站wordpress审计
  • 长春科技网站建设做网站需要编程吗
  • 建设网站运营方案114分类信息网信息发布
  • 怀化举报网站wordpress 自定义 类别
  • 襄樊北京网站建设wordpress+调用+编辑器
  • 天津展示型网站建设外包想学网站建设优化去哪
  • 有域名 有固定ip怎么做网站网站建设网站服务
  • 做动态表情包的网站html 网站源码 卖手机