C++11 很容易实现线程安全的多参数log语法

就像

myLogger("who are you?", "I‘m ZRH", "I‘m in thread:", std::this_thread::get_id());
myLogger(1, "+", 2u, "=", "3");

多个thread输出形如:

2016-04-16 10:54:54 who are you? I‘m ZRH I‘m in thread: 6736
2016-04-16 10:54:54 1 + 2 = 3
2016-04-16 10:54:54 who are you? I‘m ZRH I‘m in thread: 13528
2016-04-16 10:54:54 1 + 2 = 3
2016-04-16 10:54:54 who are you? I‘m ZRH I‘m in thread: 3036
2016-04-16 10:54:54 1 + 2 = 3

用到了

- 括号 操作符重载

- C++11 chrono, iomanip 获取和格式化输出时间戳;

- C++11 lock_guard, 保证一条log记录是线程安全的;

- C++11 variadic template, 这样就可以做到随意的参数个数和参数类型(当然,要保证参数的可打印,比如有 << 操作符实现);

- C++11 list initialization, braced-init-list, 列表初始化的形式顺序打印log,这比递归实现好多了;

时间: 2024-10-29 01:11:23

C++11 很容易实现线程安全的多参数log语法的相关文章

Android技术11:Android的线程模型

1.Android的单线程模型 在android应用程序启动时,Android会同时启动一个对应的主线程Main Thread.主线程主要负责处理UI方面的事件,所以又称UI线程.Android应用程序必须遵守单线程模型原则:androidUI操作不是线程安全的,并且这些操作必须在UI线程中完成.UI线程负责事件监听和绘图处理,因此必须保证UI线程能够随便响应用户,所以那些非常耗时的,必须放到其他线程中处理,如网络连接,数据库读取等操作,否超过一定时间没有响应,则应用程序就会终止. 2.消息队列

43_2013年11月22日 线程池 Socket(Thread Lock Process 摇奖 线程池ThreadPool)

1>模拟线程池,生产者消费者问题 using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading; using System.Threading.Tasks; namespace Product { class Program { static void Main(string[] args) { //创建一个池子 MyConncetion[]

《Android开发艺术探索》第11章 Android的线程和线程池

第11章 Android的线程和线程池 11.1 主线程和子线程 (1)在Java中默认情况下一个进程只有一个线程,也就是主线程,其他线程都是子线程,也叫工作线程.Android中的主线程主要处理和界面相关的事情,而子线程则往往用于执行耗时操作.线程的创建和销毁的开销较大,所以如果一个进程要频繁地创建和销毁线程的话,都会采用线程池的方式.(2)在Android中除了Thread,还有HandlerThread.AsyncTask以及IntentService等也都扮演着线程的角色,只是它们具有不

如何在调用线程的时候传递参数

我们在写Remoting程序或者其他的一些应用程序的时候难免要和线程打交道,.Net使我们很容易就可以创建一个线程,但是它提供的创建线程和启动线程的方法没有明显的提供参数,假如我们要用线程来启动类里面一个带参数的方法该怎么办?下面就简单的介绍如何使用.NET提供的丰富的框架来实现这个功能.为了可以生动详细的介绍整个过程,我建立下面的一个.NET类,它也是要用线程启动的方法的载体.类如下所示: using System; namespace WindowsApplication1 { /// <s

C++ 11 可变参数模板和 boost::any 实现可变参数函数

1 class SqlHelper 2 { 3 public: 4 template <typename... Params> 5 static bool preparedExecute(sql::PreparedStatement* pstmt, Params... parameters) 6 { 7 return doPreparedExecute(pstmt, 1, parameters...); 8 } 9 10 private: 11 template <typename...

学习pthreads,给线程传递多个参数

上篇博文中,boss线程给其他线程传递的只有一个参数,那么假如是多个参数呢?怎么传递呢?或许你会有这样的疑问,带着这个疑问,我们进入本文的世界,这里传递多个参数,采用结构体,为什么呢?因为结构体里可以根据自己的需要定义多个成员变量,传递过程中,我们只需要将结构体传给线程就可以了.本文分为两部分,第一部分给出代码示例,第二部分给出运行结果. 一.代码示例 二.运行结果 学习pthreads,给线程传递多个参数

Python全栈开发之11、进程和线程

一.线程 多任务可以由多进程完成,也可以由一个进程内的多线程完成,一个进程内的所有线程,共享同一块内存python中创建线程比较简单,导入threading模块,下面来看一下代码中如何创建多线程. def f1(i): time.sleep(1) print(i) if __name__ == '__main__': for i in range(5): t = threading.Thread(target=f1, args=(i,)) t.start() print('start') # 主

在不开启事件循环的线程中使用QTimer(QThread::run函数自带事件循环,在构造函数里创建线程,是一种很有意思的线程用法) good

引入 QTimer是Qt自带的定时器类,QTimer运行时是依赖于事件循环的,简单来说,在一个不开启事件循环(未调用exec() )的线程中,QTimer是无法使用的.通过分析Qt源码可发现,调用QTimer::start()后仅仅是在系统的定时器向量表中添加了一个定时器对象,但定时器并没有真正开启.定时器的开启需要通过processEvent()开始的一系列调用后才会真正得开启,这个过程中会处理定时器向量表中所有的定时器对象.那么实际exec()中也是在不断地调用processEvent()方

python 之路11 进程池,线程池

1.线程 基本使用 创建线程 import threading # def f1(arg): # print(arg) # # t = threading.Thread(target=f1,args=(123,)) # t.start() # class Mythread(threading.Thread): # def __init__(self,func,arg): # self.func = func # self.arg = arg # super(Mythread,self).__in