首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >帮助C++11宏运行带多线程或不带多线程的代码

帮助C++11宏运行带多线程或不带多线程的代码
EN

Stack Overflow用户
提问于 2016-09-28 08:41:16
回答 1查看 138关注 0票数 0

我正在尝试创建一个预处理宏,它允许代码被多线程或不依赖于运行时变量。我的第一次尝试只是一个编译时宏,并且成功了,但是运行时版本不是。

代码语言:javascript
复制
// 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

下面是一个最低限度的使用示例

代码语言:javascript
复制
#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,如果条件为false,则执行lambda,否则我将使用lambda启动一个线程。

这里的主要困难是编译时版本已经在项目中广泛使用,我试图更改宏而不重写所有以前的代码(这将导致那些__mt引用)。

代码语言:javascript
复制
#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();                                \
        }                                                \
    }        

最后一个版本使单元测试随机失败,我不明白为什么这最后一组宏与第一组不同。

如果有人能帮忙的话。谢谢

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-11-15 15:44:18

事实上,宏正在工作,这是一个使用问题。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39742221

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档