【发布时间】:2009-12-23 19:16:07
【问题描述】:
我想在我的 C/C++ 程序中使用带有原子交换汇编指令的“_test_and_set lock”汇编语言实现。
class LockImpl
{
public:
static void lockResource(DWORD resourceLock )
{
__asm
{
InUseLoop: mov eax, 0;0=In Use
xchg eax, resourceLock
cmp eax, 0
je InUseLoop
}
}
static void unLockResource(DWORD resourceLock )
{
__asm
{
mov resourceLock , 1
}
}
};
这可行,但这里有一个错误。
问题是我想传递 DWORD * resourceLock 而不是 DWORD resourceLock。
所以问题是如何将指针从 C/C++ 传递给程序集并将其取回。 ?
提前致谢。
问候, -杰。
附:这样做是为了避免用户空间和内核空间之间的上下文切换。
【问题讨论】:
-
顺便说一句,没有标准的汇编语言。此外,汇编和 C 或 C++ 之间传递的参数因编译器而异。因此,您必须提供编译器和平台标识(或查看我对平台无关进程的回答)。
-
lockResource(DWORD *resourceLock) 有什么问题?即仅将 resourceLock 声明为指针,否则保持代码相同?
-
我不明白这个问题。你试过
static void lockResource(DWORD * resourceLock)没用吗? -
@gf:现在我的目标平台是 Windows Server 2008,但最终它会是 Monta Vista:Carrer Grade 5.0。所以目前我正在使用 Visual Studio 2008 的内置编译器
-
@x4u : 没有得到你想说的.. 错误是资源只有一个实例,所有线程都得到一个指向资源的指针。资源锁是资源的一部分。这里的错误是我按值发送资源锁。我必须通过引用发送它。
标签: c++ c visual-studio-2008 pointers assembly