这是由于thread_local的实现方式不同而导致的。在一些平台或编译器中,thread_local的实现可能是通过TLS(Thread Local Storage)实现,而在另一些平台或编译器中,可能是通过关键字__declspec(thread)或__thread来实现。
如果使用TLS实现,不同的平台或编译器可能会使用不同的TLS实现方式,导致具有不同的行为。而使用关键字__declspec(thread)或__thread实现可以保证更加标准化的行为。
以下是使用__declspec(thread)的示例:
#include
using namespace std;
__declspec(thread) int x = 1;
void foo() {
cout << x << endl;
x = 2;
cout << x << endl;
}
int main() {
// main thread
foo(); // output: 1 2
cout << x << endl; // output: 1
// another thread
thread t(foo);
t.join();
cout << x << endl; // output: 1
return 0;
}
在上面的示例中,我们使用了__declspec(thread)关键字来声明变量x。这将使变量x成为线程局部存储,并且在不同的线程中具有不同的值。注意,我们需要在使用__declspec(thread)的变量前面加上关键字extern以避免定义多次。
上一篇:不同编译器得到不同的输出
下一篇:不同编译器上的void**转换