小编Mat*_*ttJ的帖子

读取互锁变量

假设:

A. WIN32下的C++.

B.正确对齐的易失性整数使用InterlockedIncrement()和递增和递减InterlockedDecrement().

__declspec (align(8)) volatile LONG _ServerState = 0;
Run Code Online (Sandbox Code Playgroud)

如果我想简单地读取_ServerState,我是否需要通过InterlockedXXX函数读取变量?

例如,我见过如下代码:

LONG x = InterlockedExchange(&_ServerState, _ServerState);
Run Code Online (Sandbox Code Playgroud)

LONG x = InterlockedCompareExchange(&_ServerState, _ServerState, _ServerState);
Run Code Online (Sandbox Code Playgroud)

目标是简单地读取当前的值_ServerState.

我不能简单地说:

if (_ServerState == some value)
{
// blah blah blah
}
Run Code Online (Sandbox Code Playgroud)

这个问题似乎有些混乱.我理解在Windows中注册大小的读取是原子的,所以我认为这个InterlockedXXX函数是不必要的.

马特J.


好的,谢谢你的回复.顺便说一句,这是Visual C++ 2005和2008.

如果这是真的,我应该使用一个InterlockedXXX函数来读取它的值_ServerState,即使只是为了清楚起见,最好的方法是什么?

LONG x = InterlockedExchange(&_ServerState, _ServerState);
Run Code Online (Sandbox Code Playgroud)

这具有修改值的副作用,当我真正想做的就是阅读它.不仅如此,如果存在上下文切换,我可以将标志重置为错误的值,因为_ServerState在准备调用时将值推到堆栈上InterlockedExchange().

LONG x = InterlockedCompareExchange(&_ServerState, _ServerState, _ServerState);
Run Code Online (Sandbox Code Playgroud)

我从我在MSDN上看到的一个例子中得到了这个.
http://msdn.microsoft.com/en-us/library/ms686355(VS.85).aspx

我所需要的只是一条线:

lock mov …
Run Code Online (Sandbox Code Playgroud)

c++ windows multithreading locking interlocked

25
推荐指数
4
解决办法
2万
查看次数

WPF从代码后面设置命名样式元素?

我有一个用户控件,它将样式应用于按钮,样式包含ControlTemplate部分.在ControlTemplate中,有各种UI元素,如Ellipse和Path.

如果我给这些元素 - Ellipse和Path - 一个带x:Name的名称,我可以从后面的代码中访问它们吗?

看起来样式的Ellipse和Path是不可见的,因为我收到编译错误(C#).

我是以错误的方式来做这件事的吗?

wpf styles controltemplate

7
推荐指数
1
解决办法
1万
查看次数