- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
下面是一个简单的程序,它使用共享库中的非 POD 类型的 C++11 thread_local 变量进行测试。
如果我使用自制的 clang ,这很好用:
> /usr/local/Cellar/llvm/3.5.0_2/bin/clang --version
clang version 3.5.0 (tags/RELEASE_350/final)
Target: x86_64-apple-darwin14.0.0
Thread model: posix
> cmake .. -G Ninja -DCMAKE_C_COMPILER=/usr/local/Cellar/llvm/3.5.0_2/bin/clang -DCMAKE_CXX_COMPILER=/usr/local/Cellar/llvm/3.5.0_2/bin/clang++
-- The C compiler identification is Clang 3.5.0
-- The CXX compiler identification is Clang 3.5.0
-- Check for working C compiler using: Ninja
-- Check for working C compiler using: Ninja -- works
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
-- Check for working CXX compiler using: Ninja
-- Check for working CXX compiler using: Ninja -- works
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Configuring done
-- Generating done
> ninja all
...
> ./main
XXX LifeCycle::LifeCycle 0x7fedc0c04b90
X before: -17
XXX LifeCycle::LifeCycle 0x7fedc0c04c10
X before in thread: -17
X after in thread: 2
XXX LifeCycle::~LifeCycle 0x7fedc0c04c10
X after: 1
XXX LifeCycle::~LifeCycle 0x7fedc0c04b90
> /usr/bin/clang --version
Apple LLVM version 6.0 (clang-600.0.56) (based on LLVM 3.5svn)
Target: x86_64-apple-darwin14.0.0
Thread model: posix
> cmake .. -G Ninja -DCMAKE_C_COMPILER=/usr/bin/clang -DCMAKE_CXX_COMPILER=/usr/bin/clang++
-- The C compiler identification is AppleClang 6.0.0.6000056
-- The CXX compiler identification is AppleClang 6.0.0.6000056
-- Check for working C compiler using: Ninja
-- Check for working C compiler using: Ninja -- works
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
-- Check for working CXX compiler using: Ninja
-- Check for working CXX compiler using: Ninja -- works
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Configuring done
-- Generating done
-- Build files have been written to:
> ninja all
[1/4] Building CXX object CMakeFiles/lib.dir/lib.cpp.o
FAILED: /usr/bin/clang++ -Dlib_EXPORTS -Wall -std=c++11 -mmacosx-version-min=10.7 -stdlib=libc++ -fPIC -MMD -MT CMakeFiles/lib.dir/lib.cpp.o -MF CMakeFiles/lib.dir/lib.cpp.o.d -o CMakeFiles/lib.dir/lib.cpp.o -c ../lib.cpp
../lib.cpp:23:5: error: thread-local storage is unsupported for the current target
thread_local LifeCycle lc;
^
1 error generated.
ninja: build stopped: subcommand failed.
#pragma once
int doit(int) __attribute__((__visibility__("default")));
#include "lib.h"
#include <thread>
#include <cstdlib>
#include <cstdio>
namespace {
class LifeCycle {
public:
LifeCycle()
: x(-17) {
printf("XXX LifeCycle::LifeCycle %p\n", this);
}
~LifeCycle() {
printf("XXX LifeCycle::~LifeCycle %p\n", this);
}
int x;
};
thread_local LifeCycle lc;
} // namespace
int doit(int arg) {
printf("X before: %d\n", lc.x);
lc.x = arg;
std::thread xwriter([arg]() {
if (lc.x == arg)
abort();
printf("X before in thread: %d\n", lc.x);
lc.x = arg + 1;
printf("X after in thread: %d\n", lc.x);
});
xwriter.join();
printf("X after: %d\n", lc.x);
return (lc.x == arg ? EXIT_SUCCESS : EXIT_FAILURE);
}
#include "lib.h"
int main(int argc, char* argv[]) {
return doit(argc);
}
cmake_minimum_required(VERSION 3.1)
set(CMAKE_CXX_FLAGS "-Wall -std=c++11 -mmacosx-version-min=10.7 -stdlib=libc++")
add_library(lib SHARED lib.cpp)
add_executable(main main.cpp)
target_link_libraries(main lib)
最佳答案
Xcode 8 及更高版本中包含的 clang 编译器支持 C++11 thread_local
关键词。此功能已添加到 Xcode 8 beta 中,如 the WWDC 2016 video "What's New in LLVM" 中所述。 , 从 the 5:50 mark 开始. ( external transcript )
问题中列出的示例程序在 OS X 10.11.6 下使用 Xcode 8 GM 编译和运行,并产生预期的输出。它随后在 macOS 10.13.4 下的 Xcode 9.3 和 macOS 10.14.4 下的 Xcode 10.2.1 进行了重新测试,并继续按预期运行。
关于iOS,我通过实验发现thread_local
支持 iOS 9 及更高版本,但不支持 iOS 8.4 或更早版本。
对于 Xcode 7.x 及更早版本,以下是 2014 年 Apple 工程师在旧 Apple Developer Forum(不再可访问)上的回答:
We don't support the thread_local implementation from the open-source Clang because we believe we can provide a higher-performance implementation for our platforms using various features in the dynamic linker. Such an implementation would be ABI-incompatible with the implementation in the open-source Clang, so we won't support thread_local until we get an implementation we can live with for the foreseeable future.
thread_local
Xcode 6.3 中仍然不支持。
关于xcode - 为什么当 'official' clang 支持 C++11 thread_local 时,Apple clang 不允许它,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28094794/
我想知道以下两个声明之间的区别是什么,如果两者都写在一个头文件中: inline thread_local MyClass obj1; // inline with thread_local thr
“所有具有线程局部存储持续时间的非局部变量都作为线程启动的一部分进行初始化,在线程函数开始执行之前进行排序。” ( https://en.cppreference.com/w/cpp/language
我在文件 tracker.hpp 中有一个变量: namespace TRIALS { static thread_local int a = -1; } 我在 ema.hpp/ema.cpp
我认为如果函数不修改非本地数据,它们就是线程安全的。 根据这个answer,我的假设是正确的.但是,最近我遇到了这段代码, int intRand(const int & min, const int
我在销毁 thread_local 静态对象时遇到问题。 #include #include struct UsesLoc { UsesLoc() { loc.counte
我认为如果函数不修改非本地数据,它们就是线程安全的。 根据这个answer,我的假设是正确的.但是,最近我遇到了这段代码, int intRand(const int & min, const int
在我的代码中使用 thread_local 之前,我想更好地理解它。 比方说,我声明 thread_local myclass value; 这将为每个使用 myclass 的线程创建 value 的
C.h: #include class C { public: explicit C(int id) { std::cout<<"Initialized "<
我知道这是一个非常基本的问题,但我找不到简单的答案。 我正在编写一个程序,其中我需要一些变量是 thread_local。根据我的理解,这意味着这些变量“像全局变量”,但每个线程都有自己的拷贝。 我以
在问题Using QSqlQuery from multiple threads结果是线程存储解决了这个问题。 我制作了一个简单的演示代码,以绝对清楚 C++11 thread_local 说明符。下
我有以下 thread_local 单例代码: struct Singl { int& ref; Singl(int& r) : ref(r) {} ~Singl() {} void
我想了解 thread_local 限定符究竟是如何工作的,以及实际变量存储在哪里?这是在 C++ 上。 假设我有一个包含多个成员变量的类。该类的对象在堆上实例化,该对象在 2 个线程之间共享。使用适
#include #include #include using namespace std; struct A { ~A() { cout << "~A()"
现在 C++ 正在添加 thread_local 存储作为语言功能,我想知道一些事情: thead_local 的成本可能是多少? 在内存中? 用于读写操作? 与此相关:操作系统通常如何实现这一点?似
考虑以下示例(为简单起见,省略了 cout 上的锁守卫)。 #include #include #include using namespace std; struct C { C() {
我正在努力解决 C++ Crash Course我遇到了以下代码 list : #include struct Tracer { Tracer(const char* name) :
我想在我的类中进行一些线程注册,因此我决定添加对 thread_local 功能的检查: #include #include class Foo { public: Foo() {
下面的代码应该初始化一个静态线程局部和静态结构。 #include struct Tracer { public: Tracer(const char *new_name) : name{new
我有一个我想构造的类成员,它应该是访问它的每个线程的本地成员。虽然构造函数需要一些参数,所以我不能依赖静态零初始化。 class ThreadMem{ public: ThreadMem(ui
我试图声明 thread_local 指针变量,然后在一个线程中指向一个新对象。 thread_local static A* s_a = nullptr; 好像线程销毁的时候新对象的内存没有释放。我
我是一名优秀的程序员,十分优秀!