Я пытаюсь использовать потокобезопасные локальные переменные в программе сборки.Я искал в сети, но я не нашел ничего простого.
В настоящее время я использую ассемблер GCC, так как программа представляет собой смесь кода C и ассемблера, но конечная программа будет содержать коддля нескольких платформ / соглашений о вызовах.
На данный момент я объявил свои переменные, используя псевдооперацию .lcomm
.Насколько я понимаю, эти переменные будут размещены в разделе .bss
.Поэтому я предполагаю, что они будут общими для всех потоков.
Есть ли способ иметь переменные TLS непосредственно в сборке, или мне следует использовать специфичные для платформы реализации, такие как pthread
или __declspec
вWindows?
Надеюсь, это достаточно ясно.Не стесняйтесь спрашивать, нужна ли дополнительная информация.
Спасибо всем,
РЕДАКТИРОВАТЬ
Вот код вопроса:
.lcomm stack0, 8
.lcomm stack1, 8
.globl _XSRuntime_CallMethod
_XSRuntime_CallMethod:
pushq %rbp
movq %rsp, %rbp
xor %rax, %rax
popq stack0( %rip )
popq stack1( %rip )
callq *%rdi
pushq stack1( %rip )
pushq stack0( %rip )
leave
ret
Обычно он используется для перенаправления вызова функции C.
Прототип C:
extern uint64_t XSRuntime_CallMethod( void ( *m )( void * self, ... ), ... );
В качестве первого аргумента принимает указатель на функцию, следовательно,callq *%rdi
, так как я тестирую это с ABI системы V.
Код сборки очень прост, и я бы хотел оставить его таким, чтобы его можно было легко обслуживать.
Вопрос в том, как сделать переменные stack0
и stack1
потокобезопасными.