C++多线程调试宏
C++ Multithreaded debug macro
我正在尝试编写一个简单的调试宏,该宏将与运行它的多个线程一起工作。我显然缺少了一些东西,因为std::cout输出没有同步。非常感谢您的帮助。
//=======Debugger========//
#ifndef _DEBUGGER_H_
#define _DEBUGGER_H_
#include <iostream>
#include <thread>
#include <mutex>
/*
* Debugger. All messages are directed to std::cout
*/
#ifndef WITH_NOCOLOR
#define COLOR_GREEN "e[0;32m"
#define COLOR_RED "e[1;91m"
#define COLOR_CYAN "e[1;36m"
#define COLOR_YELLOW "e[1;33m"
#define COLOR_ORANGE "e[0;33m"
#define RESET_COLOR "e[m"
#else
#define COLOR_GREEN ""
#define COLOR_RED ""
#define COLOR_CYAN ""
#define COLOR_YELLOW ""
#define COLOR_ORANGE ""
#define RESET_COLOR ""
#endif //WITH_NOCOLOR
#define THREAD_ID "[thread: " << std::this_thread::get_id() << "] "
#define THREAD_SYNC_START { std::lock_guard< std::mutex > lock( sync_mutex );
#define THREAD_SYNC_STOP }
static std::mutex sync_mutex;
#define DEBUG "[Debug]: "
#define ERROR "[Error]: "
#define INFO "[Info ]: "
#define WARNING "[Warn ]: "
#define Debug(x) do { THREAD_SYNC_START
std::cout << COLOR_CYAN << DEBUG << RESET_COLOR << THREAD_ID << x << std::endl;
THREAD_SYNC_STOP
}while(0)
#define Err(x) do { THREAD_SYNC_START
std::cout << COLOR_RED << ERROR << COLOR_ORANGE << THREAD_ID << x << RESET_COLOR << std::endl;
THREAD_SYNC_STOP
}while(0)
#define Info(x) do { THREAD_SYNC_START
std::cout << INFO << THREAD_ID << x <<std::endl;
THREAD_SYNC_STOP
}while(0)
#define Warn(x) do { THREAD_SYNC_START
std::cout << COLOR_YELLOW << WARNING << RESET_COLOR << THREAD_ID << x << std::endl;
THREAD_SYNC_STOP
}while(0);
#endif //_DEBUGGER_H_
输出:
[Debug]:[线程:[调试]:[螺纹:1074275136]正在启动日志。。109953248]初始化启动
Youre sync_mutex
是static
命名空间范围变量,这意味着它具有内部链接—包括报头的每个转换单元(.cpp
文件)将具有其自己的互斥体副本。因此,来自不同翻译单元的访问是不同步的。
您需要确保整个程序只有一个sync_mutex
对象。最明显的方法是将互斥对象转换为extern
变量,而不是static
变量,然后在一个源文件中定义它。
或者,如果您只想保留头,您可以将其作为内联函数中的静态局部变量:
#define THREAD_SYNC_START { std::lock_guard< std::mutex > lock( sync_mutex() );
inline std::mutex& sync_mutex()
{
static std::mutex m;
return m;
}
相关文章:
- 在C++中使用cURL和多线程
- 多线程双缓冲区
- 为什么我的多线程作业队列崩溃
- Visual Studio 发布模式阻止在调试模式下执行的代码.使用 WinHTTP 和多线程
- if 语句仅在前面有调试 cout 行(C 中的多线程)时才通过
- 设置(C++)多线程调试(/MTd)时会发生崩溃
- 复制/调试一些多线程地狱
- 使用大型线程池调试多线程C++应用程序
- 多线程效率低下:调试错误共享
- 使用多线程调试 DLL (/MDd) C 运行时库生成静态 Opencv 库
- 在 GDB 中调试多线程服务器 - 查找每个线程的状态.执行时继续并停止
- Eclipse CDT 多线程调试不是最佳的 - 如何以独占方式运行线程
- GDB调试多线程,单线程无法预测执行
- 如何在C++Qt程序中调试多线程死锁
- 在多线程c++应用程序中,调试分段错误的一些常见方法是什么
- 调试多线程服务器
- 如何在这个小的多线程程序中调试死锁
- CRT参数验证使多线程调试程序崩溃
- Qt多线程项目-调试器冻结
- C++多线程调试宏