在有或没有多线程的情况下帮助 C++11 宏编写 运行 代码
Helping C++11 macros to run code with or without multithreading
我正在尝试创建一个预处理宏,它允许代码根据运行时变量进行多线程处理或不进行多线程处理。
我的第一次尝试只是一个编译时宏并且有效,但运行时版本不是。
// Working compile-time version (defined in MultiThreadMacros.h)
#ifdef USE_MT
#define MT_START(Thread) \
std::atomic<bool> Thread ## Ret = true; \
std::thread Thread([&]() \
{ \
std::atomic<bool> & __mtRet = Thread ## Ret; \
try{
#define MT_END \
}catch(...){__mtRet = false;} \
};
#define MT_JOIN(Thread) \
if (Thread.joinable()) Thread.join(); \
if (Thread ## Ret){ throw; }
#else
#define MT_START(Thread)
#define MT_END
#endif
这是一个最小的使用示例
#define USE_MT
#include "MultiThreadMacros.h"
void function()
{
int i = 0;
int j = 0;
MT_START(th1)
{
i += 2;
MT_START(th3)
{
i += 4;
}
MT_END;
MT_JOIN(th3);
}
MT_END;
MT_START(th2)
{
j += 2;
}
MT_END
MT_JOIN(th1);
MT_JOIN(th2);
}
现在这是有条件的版本。我从用户代码创建一个 lambda 并在条件为假时执行 lambda,否则我将使用 lambda 启动一个线程。
这里的主要困难是编译时版本已经在项目中广泛使用,我试图在不重写所有以前的代码的情况下更改宏(这导致那些 __mt 引用)
#define MT_START(Thread, Cond) \
std::thread Thread; \
std::atomic<bool> Thread ## Ret = true; \
{ \
auto & __mtTh = Thread; \
const bool __mtCond = Cond; \
auto __mtLambda = [&]() -> void \
{ \
std::atomic<bool> & __mtRet = Thread ## Ret; \
try {
#define MT_END \
}catch(...){__mtRet = false;} \
}; \
if (__mtCond) \
{ \
__mtTh = std::thread{__mtLambda}; \
} \
else \
{ \
__mtLambda(); \
} \
}
最后一个版本使单元测试随机失败,我不明白为什么最后一组宏与第一组不同。
如果有人能帮忙。
谢谢
其实宏是可以用的,是使用问题
我正在尝试创建一个预处理宏,它允许代码根据运行时变量进行多线程处理或不进行多线程处理。 我的第一次尝试只是一个编译时宏并且有效,但运行时版本不是。
// Working compile-time version (defined in MultiThreadMacros.h)
#ifdef USE_MT
#define MT_START(Thread) \
std::atomic<bool> Thread ## Ret = true; \
std::thread Thread([&]() \
{ \
std::atomic<bool> & __mtRet = Thread ## Ret; \
try{
#define MT_END \
}catch(...){__mtRet = false;} \
};
#define MT_JOIN(Thread) \
if (Thread.joinable()) Thread.join(); \
if (Thread ## Ret){ throw; }
#else
#define MT_START(Thread)
#define MT_END
#endif
这是一个最小的使用示例
#define USE_MT
#include "MultiThreadMacros.h"
void function()
{
int i = 0;
int j = 0;
MT_START(th1)
{
i += 2;
MT_START(th3)
{
i += 4;
}
MT_END;
MT_JOIN(th3);
}
MT_END;
MT_START(th2)
{
j += 2;
}
MT_END
MT_JOIN(th1);
MT_JOIN(th2);
}
现在这是有条件的版本。我从用户代码创建一个 lambda 并在条件为假时执行 lambda,否则我将使用 lambda 启动一个线程。
这里的主要困难是编译时版本已经在项目中广泛使用,我试图在不重写所有以前的代码的情况下更改宏(这导致那些 __mt 引用)
#define MT_START(Thread, Cond) \
std::thread Thread; \
std::atomic<bool> Thread ## Ret = true; \
{ \
auto & __mtTh = Thread; \
const bool __mtCond = Cond; \
auto __mtLambda = [&]() -> void \
{ \
std::atomic<bool> & __mtRet = Thread ## Ret; \
try {
#define MT_END \
}catch(...){__mtRet = false;} \
}; \
if (__mtCond) \
{ \
__mtTh = std::thread{__mtLambda}; \
} \
else \
{ \
__mtLambda(); \
} \
}
最后一个版本使单元测试随机失败,我不明白为什么最后一组宏与第一组不同。
如果有人能帮忙。 谢谢
其实宏是可以用的,是使用问题