假设:
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) 我正在建立一个允许我以各种编码方式获取字符串的API,包括utf8,utf16,utf32和wchar_t(根据操作系统可能是utf32或utf16).
新的C++标准已推出了新的类型char16_t,并char32_t没有这个的sizeof歧义,应在今后的使用,所以我想支持他们为好,但问题是,它们会干扰正常的uint16_t,uint32_t,wchar_t类型不允许超载,因为他们可以指同一类型?
class some_class {
public:
void set(std::string); // utf8 string
void set(std::wstring); // wchar string utf16 or utf32 according
// to sizeof(wchar_t)
void set(std::basic_string<uint16_t>)
// wchar independent utf16 string
void set(std::basic_string<uint32_t>);
// wchar independent utf32 string
#ifdef HAVE_NEW_UNICODE_CHARRECTERS
void set(std::basic_string<char16_t>)
// new standard utf16 string
void set(std::basic_string<char32_t>);
// new standard utf32 string
#endif
};
Run Code Online (Sandbox Code Playgroud)
所以我可以写:
foo.set(U"Some utf32 String");
foo.set(u"Some utf16 string");
Run Code Online (Sandbox Code Playgroud)什么是typedef的std::basic_string<char16_t>和std::basic_string<char32_t>今天有:
typedef …Run Code Online (Sandbox Code Playgroud)我有一个使用HTML5视频标签的iPhone网页.在iPhone上,此类嵌入式视频在本机播放器中播放.我想查看视频何时结束以及用户是否已使用"完成"按钮解除视频.最初,我试过这个:
var video = $("#someVideo").get(0);
video.addEventListener('ended', myFunction);
Run Code Online (Sandbox Code Playgroud)
但只有在视频被允许完成时才会被解雇.在玩了一些其他事件(暂停,停顿,等待)后,我发现"完成"按钮会触发"暂停"事件.但是,当我添加这个:
video.addEventListener('pause', myFunction);
Run Code Online (Sandbox Code Playgroud)
我的代码是从"完成"按钮称为既与当用户点击的播放控件暂停按钮.第二种情况是不可取的; 我只想要第一个案例,但事件似乎没有给我足够的信息.
有没有人知道如何判断用户何时点击iPhone播放器中的"完成"按钮(而不是简单地暂停)?
我期待一个类似于Windows API的Linux API.我在Google上看到的只是对Qt和GTK的引用.我真的不需要用OpenGL绘制一个简单的窗口,所以这些库看起来很臃肿供我使用.Qt和GTK用什么来在Linux下创建窗口?有没有更低级别的?
我创建了一个很好的长密码,使用了几次,然后忘了它;)扭曲是,我知道一般主题,可能几乎所有的角色.我内心的完美主义者不想撤销关键或类似的东西(我想我无论如何都需要密码取消它,对吧?).我觉得我应该能够通过粗暴的方式很好地解决这个问题 - 强迫可能的布局/字符我错了/错误输入.我写了一个C程序来生成这样的组合.不幸的是,我没有代码可以提供(我现在将使用"它不相关"的借口;).我还在网上看到了一些使用GPGME的代码来做这个概念验证.它有评论"这可以轻松快100倍".问题是,分析代码显示了作为GPGME调用本身的瓶颈.这是预期的,还是GPGME的限制可以使用完整的库或专用实现来解决?
你会怎么做呢?显然,这种方法是不可行的任何像样的未知密码,但我认为最关键的是,我知道什么我输入不知道确切的格式怎么我输入了-应该是可行的,不是吗?
C++ 11引入char16_t并char32_t便于使用UTF-16和UTF-32编码的文本字符串.但是该<iostream>库仍然只支持wchar_t为多字节I/O 定义的实现.
为什么支持char16_t和char32_t未添加到<iostream>库中以补充wchar_t支持?
在[dcl.attr.depend]/1中,我读到:
属性[...]
carries_dependency[...]可以被应用到declarator-id的parameter-declaration在函数声明或λ,在这种情况下,它SPECI音响上课该参数的初始化携带依赖性(1.10)的每个左值到右值该对象的转换(4.1).该属性也可以应用于declarator-id函数声明,在这种情况下,它指定返回值(如果有的话)对函数调用表达式的求值具有依赖性.
我缺少的是一种将属性应用于隐式this参数的方法.
举例来说,考虑这个免费功能:
void fun(int i, Foo * [[carries_dependency]] f);
Run Code Online (Sandbox Code Playgroud)
它等同于(但对于属性)成员版本:
void Foo::fun(int i); // can't add [[carries_dependency]] here?
Run Code Online (Sandbox Code Playgroud) 可以使用C++ 11 std::hash类型来散列函数指针吗?有一个hash部分专业化定义为
template <typename T> struct hash<T*>;
Run Code Online (Sandbox Code Playgroud)
但由于函数指针与C++中的其他指针类型不同(例如它们无法转换为void*),我不确定将它用于类似int(*)()或类型的类型是否安全void(*)(int, int).
这是允许的吗?新ISO规范中是否有任何特定的措辞支持或驳斥这一点?
谢谢!
如果我有一个A类,它的一个功能是:
void A::func()
{
emit first_signal();
emit second_signal();
}
Run Code Online (Sandbox Code Playgroud)
假设B类有2个插槽,一个连接到first_signal,和另一对second_signal中,它保证该连接的时隙first_signal总是被处理之前的second_signal时隙?
下面的程序打印标准写入的每个字符,但只有在写完新行之后(至少在我的系统上!).
public class Test {
public static void main(String[] args) throws java.io.IOException {
int c;
while ((c = System.in.read()) != -1)
System.out.print((char) c);
}
}
Run Code Online (Sandbox Code Playgroud)
这可以防止人们写"按任意键继续"之类的内容,并强制执行"按Enter键继续"等操作.