小编Mar*_*utz的帖子

读取互锁变量

假设:

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万
查看次数

C++ 0x中的新unicode字符

我正在建立一个允许我以各种编码方式获取字符串的API,包括utf8,utf16,utf32和wchar_t(根据操作系统可能是utf32或utf16).

  1. 新的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)
  2. 什么是typedef的std::basic_string<char16_t>std::basic_string<char32_t>今天有:

    typedef …
    Run Code Online (Sandbox Code Playgroud)

c++ unicode c++11 char16-t char32-t

25
推荐指数
1
解决办法
5743
查看次数

在iPhone上使用html5视频事件,如何通过简单的暂停告诉"完成"按钮?

我有一个使用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播放器中的"完成"按钮(而不是简单地暂停)?

iphone video html5

23
推荐指数
3
解决办法
2万
查看次数

如何在Linux中使用C++创建窗口?

我期待一个类似于Windows API的Linux API.我在Google上看到的只是对Qt和GTK的引用.我真的不需要用OpenGL绘制一个简单的窗口,所以这些库看起来很臃肿供我使用.Qt和GTK用什么来在Linux下创建窗口?有没有更低级别的?

c++ linux window

23
推荐指数
3
解决办法
3万
查看次数

软蛮强制自己的GPG/PGP密码的最佳方法是什么?

我创建了一个很好的长密码,使用了几次,然后忘了它;)扭曲是,我知道一般主题,可能几乎所有的角色.我内心的完美主义者不想撤销关键或类似的东西(我想我无论如何都需要密码取消它,对吧?).我觉得我应该能够通过粗暴的方式很好地解决这个问题 - 强迫可能的布局/字符我错了/错误输入.我写了一个C程序来生成这样的组合.不幸的是,我没有代码可以提供(我现在将使用"它不相关"的借口;).我还在网上看到了一些使用GPGME的代码来做这个概念验证.它有评论"这可以轻松快100倍".问题是,分析代码显示了作为GPGME调用本身的瓶颈.这是预期的,还是GPGME的限制可以使用完整的库或专用实现来解决?

你会怎么做呢?显然,这种方法是不可行的任何像样的未知密码,但我认为最关键的是,我知道什么我输入不知道确切的格式怎么我输入了-应该是可行的,不是吗?

security gnupg gpgme

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

在I/O中使用char16_t和char32_t

C++ 11引入char16_tchar32_t便于使用UTF-16和UTF-32编码的文本字符串.但是该<iostream>库仍然只支持wchar_t为多字节I/O 定义的实现.

为什么支持char16_tchar32_t未添加到<iostream>库中以补充wchar_t支持?

c++ iostream c++11 char16-t char32-t

21
推荐指数
1
解决办法
8540
查看次数

在C++ 11中,如何指定隐含的"this"参数"[[carry_dependency]]"?

[dcl.attr.depend]/1中,我读到:

属性[...] carries_dependency[...]可以被应用到declarator-idparameter-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++ member-functions c++11 carries-dependency

21
推荐指数
1
解决办法
581
查看次数

可以使用std :: hash来散列函数指针吗?

可以使用C++ 11 std::hash类型来散列函数指针吗?有一个hash部分专业化定义为

template <typename T> struct hash<T*>;
Run Code Online (Sandbox Code Playgroud)

但由于函数指针与C++中的其他指针类型不同(例如它们无法转换为void*),我不确定将它用于类似int(*)()或类型的类型是否安全void(*)(int, int).

这是允许的吗?新ISO规范中是否有任何特定的措辞支持或驳斥这一点?

谢谢!

c++ hash pointers c++11 stdhash

20
推荐指数
1
解决办法
2660
查看次数

问:事件是否按顺序处理?

如果我有一个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时隙?

qt signals-slots

19
推荐指数
1
解决办法
5712
查看次数

为什么我们不能一次从System.in读取一个字符?

下面的程序打印标准写入的每个字符,但只有在写完新行之后(至少在我的系统上!).

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键继续"等操作.

  • 这是什么原因?
  • 它是Java的限制吗?
  • 这种行为依赖于系统(我在Ubuntu上)吗?它在Mac上如何运作?视窗?
  • 它是否依赖于我运行应用程序的特定终端?(对我来说,它在Eclipse和gnome-terminal中表现得像这样)
  • 有解决方法吗?

java stdin

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