【发布时间】:2011-05-24 13:25:09
【问题描述】:
我正在尝试在汇编程序中使用线程安全的局部变量。 我在网上搜索过,但没有发现任何简单的东西。
我目前正在使用 GCC 汇编器,因为该程序是 C 代码和汇编的混合体,但最终程序将包含多平台/调用约定的代码。
现在,我已经使用 .lcomm 伪操作声明了我的变量。
据我了解,这些变量将放在.bss 部分。
所以我猜它们会被所有线程共享。
有没有办法在程序集中直接使用一种 TLS 变量,或者我应该使用特定于平台的实现,例如 Windows 上的 pthread 或 __declspec?
希望它足够清楚。不要犹豫,询问是否需要更多信息。
谢谢大家,
编辑
这是有问题的代码:
.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,因为我正在使用系统 V ABI 进行测试。
汇编代码非常简单,我想保持这种方式,以便于维护。
问题是:如何使stack0 和stack1 变量线程安全。
【问题讨论】:
-
您在用汇编程序编写时为什么担心特定于平台的问题?
-
因为有一种“跨平台”的方式会更容易,更容易维护。
-
我不明白汇编是如何跨平台的。我认为每个不同的平台都有不同的规则。
-
是的,没错。我只是想尽量减少不同实现之间的差异。 :)
-
下次请尝试先问实际问题,而不是“[我决定用 X 解决它,所以] 我该怎么做 X?”
标签: multithreading assembly thread-local-storage