Я ищу то же самое.
Как я вижу, никто не ответил на ваш вопрос, после того, как я вошел в Интернет всеми способами, я пришел к следующей информации: предположим, что для компиляции gcc на Linux (Ubuntu) и с использованием -m64, регистр сегмента gs содержит значение 0. Скрытая часть сегмента (с линейным адресом)
указывает на конкретную локальную область потока.
Эта область содержит по этому адресу адрес этого адреса (64 бита). По нижним адресам хранятся все локальные переменные потока.
Этот адрес native_handle()
.
Таким образом, чтобы получить доступ к локальным данным потоков, вы должны сделать это через этот указатель.
Другими словами: (char*)&variable-(char*)myThread.native_handle()+(char*)theOtherThread.native_handle()
Код, демонстрирующий вышесказанное, предполагая, что g ++, linux, pthreads:
#include <iostream>
#include <thread>
#include <sstream>
thread_local int B=0x11111111,A=0x22222222;
bool shouldContinue=false;
void code(){
while(!shouldContinue);
std::stringstream ss;
ss<<" A:"<<A<<" B:"<<B<<std::endl;
std::cout<<ss.str();
}
//#define ot(th,variable)
//(*( (char*)&variable-(char*)(pthread_self())+(char*)(th.native_handle()) ))
int& ot(std::thread& th,int& v){
auto p=pthread_self();
intptr_t d=(intptr_t)&v-(intptr_t)p;
return *(int*)((char*)th.native_handle()+d);
}
int main(int argc, char **argv)
{
std::thread th1(code),th2(code),th3(code),th4(code);
ot(th1,A)=100;ot(th1,B)=110;
ot(th2,A)=200;ot(th2,B)=210;
ot(th3,A)=300;ot(th3,B)=310;
ot(th4,A)=400;ot(th4,B)=410;
shouldContinue=true;
th1.join();
th2.join();
th3.join();
th4.join();
return 0;
}