【问题标题】:Why can't TBB cast `int` to `const tbb::atomic<unsigned int>&`, but std::atomic can?为什么 TBB 不能将 `int` 转换为 `const tbb::atomic<unsigned int>&`,但 std::atomic 可以?
【发布时间】:2017-08-24 11:40:02
【问题描述】:

我正在尝试构建一个具有许多依赖项的大型项目。阻止它构建的最后一件事(?)是 TBB 未能处理将int 转换为const tbb::&lt;unsigned int&gt;&amp;。烦人的是使用std::atomic(特别是const std::atomic&lt;unsigned int&gt;&amp;)的相同演员可以正常工作。我无法重构代码以使用std 而不是tbb(它使用了tbb 的其他不属于std 的功能)。

我创建了以下简单的测试用例:

#include <tbb/atomic.h>
#include <atomic>

void good(const std::atomic<unsigned int>& i) {
}

void bad(const tbb::atomic<unsigned int>& i) {
}

int main() {
    good(1);
    bad(1); // error C2664: 'void bad(const tbb::atomic<unsigned int> &)': cannot convert argument 1 from 'int' to 'const tbb::atomic<unsigned int> &'
}

有谁知道如何解决这个问题(不删除 TBB 的使用)?我需要它在 VS2017 中工作。

编辑: 另外,我收到以下错误: Error (active) E0415 no suitable constructor exists to convert from "int" to "tbb::atomic&lt;unsigned int&gt;" Testmain.cpp 15。所以推测,如果有合适的演员,演员就会成功。我怎样才能添加一个?是否对tbb/atomic.h 进行了编辑以启用此演员表?

【问题讨论】:

  • 如果将文字更改为 1u 会发生什么?
  • 传递 1u 会产生同样的错误
  • bad(tbb::make_atomic(1u)); 修复了此测试中的错误。但我不能用它来修复大型项目。我仍然需要一种不使用make_atomic() 的方法来使这个演员工作。
  • documentation 指定由于 C++11 可以使用 constexpr c'tor,因此上述两个代码示例应该是等效的。我假设您使用的是 TBB,因为您不能使用 C++11?
  • tbb_config.h我可以看到__TBB_ATOMIC_CTORS是0。这取决于__TBB_CONSTEXPR_PRESENT。最近的 VS2017 更新 15.3 添加了constexpr 支持。我正在使用 TBB 的 NuGet 发行版。相反,我需要自己构建 TBB,以便启用 __TBB_ATOMIC_CTORS。这听起来像是问题解决了。

标签: c++ multithreading c++11 tbb


【解决方案1】:

已修复!问题在于我使用的 TBB 的 NuGet 发行版的预处理器定义已过时。 VS2017 15.3.2 版本支持constexpr,需要启用__TBB__ATOMIC_CTORS。感谢@StoryTeller 为我指明了正确的方向。

修复:Git 克隆 TBB 的最新 src 并构建。 (有趣的是,C++ 中的快捷方式很少是快捷方式)。

【讨论】:

    【解决方案2】:

    从来源(我在 https://github.com/01org/tbb/blob/tbb_2017/include/tbb/atomic.h 找到,我自己没有 TBB)我可以看到 struct atomic 只定义了一个赋值运算符,所以没有非显式构造函数,这意味着你必须使用tbb::make_atomic 显式构造它。

    【讨论】:

    • "但是我不能用它来修复这个大项目。我仍然需要一种方法来使这个演员工作不使用 make_atomic()"
    • 编写你自己的类模板,它派生自 tbb::atomic,例如将其命名为 axon::atomic,在其中实现类型 T 的构造函数。然后将全局字符串从 tbb::atomic 更改为 axon::atomic。
    • 不能(整个大型项目的代码更改太多)。我正在查看tbb_config.h,看到有一个预处理器__TBB_ATOMIC_CTORS,但我似乎无法打开它......或者它已经打开而不是我需要的c'tors
    • 我正在使用 NuGet 获取 TBB。我看到__TBB_CONSTEXPR_PRESENT 设置为 0,这会禁用__TBB_ATOMIC_CTORS,但对于 VS2017v15.3 应该是 1...所以需要为最新版本的 VS2017 重建/更新 TBB 的 NuGet 发行版
    猜你喜欢
    • 1970-01-01
    • 2011-09-23
    • 2020-09-05
    • 1970-01-01
    • 2022-09-28
    • 2016-06-12
    • 2012-07-18
    • 1970-01-01
    • 2015-12-15
    相关资源
    最近更新 更多