草庐IT

InterlockedCompareExchange

全部标签

c++ - 跨进程加载 DLL - 如何进行某些操作 "singleton-like"

背景我正在开发一个C++windows应用程序。我的应用程序将打开多个进程。每个进程都会加载一个LoggerDLL,它提供了一个接口(interface)来注册日志事件并决定何时以及如何将日志刷新到文件中。问题假设我在LoggerDLL中定义了一个简单的决定:每次注册100个日志事件时,将它们刷新到一个文件中。如何确保刷新仅由DLL的一个实例执行一次?当DLL跨进程共享并且其中一个操作只需要跨进程执行一次时,最佳实践方法是什么?注意事项定义共享内存至关重要。每个进程都需要知道其他进程的日志事件。因此,我们不能让每个DLL实例都存储自己的日志并分别刷新它们。

c++ - InterlockedCompareExchange - 确切的对齐要求是什么以及如何执行它们?

我无法理解MSDN文档对InterlockedVariableAccess的含义函数族。我用InterlockedExchange用于设置和InterlockedCompareExchange用于获取由多个线程使用的成员变量。该成员位于一个1字节的打包类中:#pragmapack(1)classMyClass{char_;longm_MyMember;//...}所以成员是由设置的InterlockedExchange(&m_MyMember,1);得到了longvalue=InterlockedCompareExchange(&m_MyMember,0,0);InterlockedE

windows - 用户空间中断计时器访问,例如通过 KeQueryInterruptTime(或类似的)

是否有“Nt”或类似的(即非内核模式驱动程序)函数等同于KeQueryInterruptTime或类似的东西?好像没有NtQueryInterruptTime之类的东西,至少我没找到。我想要的是某种相当准确和可靠的单调计时器(因此不是QPC)它相当高效并且不会像溢出的32位计数器那样令人惊讶,并且没有不必要的“智能”、无时区或复杂结构。理想情况下,我想要类似timeGetTime的64位值。它甚至不必是同一个计时器。从Vista开始存在GetTickCount64,这本身是可以接受的,但我不想仅仅因为这样一个愚蠢的原因而中断XP支持。读取0x7FFE0008处的四字,如here所示..

c++ - _InterlockedCompareExchange 文档中 "The sign is ignored"的含义

_InterlockedCompareExchange的文档对每个参数说Thesignisignored.这是否意味着像0xffff和0x7fff(对于16位版本)这样的数字将被_InterlockedCompareExchange16等视为相等其他宽度内在函数?或者这是否意味着内在函数接受有符号和无符号整数?还是别的?如果这不是文档中的错误,它至少看起来是模棱两可的。 最佳答案 符号位不会被忽略,就像其他位一样进行比较。..CompareExchange..函数只关心位的相等性,不以任何特殊方式解释它们。在基于x86的系统上,它们

c++ - 使用 InterlockedCompareExchange 无锁

我正在尝试使用互锁操作使以下代码片段无锁,知道如何翻译吗?if(m_Ref==0xFFFF)m_Ref=1;else{if(++m_Ref==1)CallSomething();//}我在想类似的东西if(InterlockedCompareExchange(&m_Ref,1,0xFFFF)!=0xFFFF)){if(InterlockedIncrement(&m_Ref)==1)CallSomething();}这里面有什么问题/竞争吗? 最佳答案 从表面上看这看起来是正确的,但每次您连续使用两个互锁操作时,您都会将自己暴露在AB