小编Dis*_*ame的帖子

为什么有些人使用交换进行移动分配?

例如,stdlibc ++具有以下内容:

unique_lock& operator=(unique_lock&& __u)
{
    if(_M_owns)
        unlock();
    unique_lock(std::move(__u)).swap(*this);
    __u._M_device = 0;
    __u._M_owns = false;
    return *this;
}
Run Code Online (Sandbox Code Playgroud)

为什么不直接将两个__成员分配给*?交换是否意味着__u被分配了*this成员,后来才分配0和false ...在这种情况下交换正在做不必要的工作.我错过了什么?(unique_lock :: swap只对每个成员执行std :: swap)

c++ rvalue-reference move-semantics copy-and-swap c++11

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

没有Aero组合的没有vsync; 无法在CreateDesktop()制作桌面上打开Aero

我正在使用OpenGL进行渲染.我的东西是沙箱,所以我使用CreateDesktop()来防止破碎攻击.但是,新桌面在出于任何原因创建时没有Aero组合(虽然默认情况下是这样)并且尝试使用DwmEnableComposition()启用它失败.我不知道为什么,或者如何解决这个问题.DwmEnableComposition()在默认桌面上运行正常.有没有办法让vs vsync在没有合成的情况下工作?即使从nvidia的驱动程序控制面板强制执行,我也无法做到这一点.这里有什么解决方案?

我正在使用Windows 7.在Windows 8中,他们说无法禁用合成,所以我想知道这个问题是否会再存在.

windows opengl sandbox composition

10
推荐指数
1
解决办法
1200
查看次数

具有共享streambuf的istream和ostream对于双工I/O是否相互线程安全?

我已经为缓冲网络套接字I/O派生了一个自定义streambuf,覆盖了下溢,溢出和同步,因此下溢与其他两个的集合是相互线程安全的(我有单独的输入和输出内部缓冲区).这工作正常,但我想将它用于全双工I/O,其中一个线程可以输入而另一个线程输出,所以我想使用istream作为接收线程,使用ostream作为发送一个,同时共享网络streambuf因为它抽象了所有套接字的东西.我的问题是,如果输入和输出缓冲区是分开的,那么受流量输入操作影响的streambuf成员在多大程度上会受到受流量输出操作影响的streambuf成员的影响?

最好是能够做到这一点,而不是必须将套接字东西与我的streambuf抽象分开,这样套接字可以在istream和ostream之间使用单独的streambuf共享 - 那么我还需要两个版本的streambuf--一个带有单个内部缓冲区(仅用于istream或仅用于ostream),另一个带有两个内部缓冲区,如我现在所用,用于iostream ...因为它的附加类和代码重复很糟糕.

c++ sockets multithreading iostream stream

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

__faststorefence的行为是什么?

关于这个问题,我只对x86和x86-64感兴趣.

对于MSVC 2005,__ faststorefence的文档说:"保证每个先前的商店在任何后续商店之前全局可见."

对于MSVC 2008和2010,它改为:"保证每个先前的内存引用,包括加载和存储内存引用,在任何后续内存引用之前全局可见."

写入后者的方式,我认为这也会阻止CPU在旧商店之前重新排序负载.这与第一个定义不同,后者暗示内在函数仅用于处理使用旧存储的非临时存储的阻塞或重新排序(唯一的其他重新排序x86(-64)确实如此).

然而,文档似乎与自己相矛盾:"在x64平台上,此例程生成的指令比sfence指令更快的存储范围.在x64平台上使用此内在而不是_mm_sfence."

这意味着它仍然具有类似sfence的功能,因此仍然可以使用较旧的存储重新排序负载.那是哪个呢?有人能解决我的困惑吗?

PS:寻找这个函数的GCC版本,我遇到了long local; __asm__ __volatile__("lock; orl $0, %0;" : : "m"(local));但我觉得它来自32位代码; 什么是64位模拟?

multithreading memory-fences visual-c++ memory-barriers

6
推荐指数
1
解决办法
1482
查看次数

在另一个线程中注入C++异常

使用exception_ptr的C++ 0x特性,可以在一个线程中存储异常,并让另一个线程访问它.但是,另一个线程必须调用rethrow_exception().但是,在某些情况下,我需要实际中断其他线程并立即在那里引发异常; 将exception_ptr轮询为非null不是解决方案.

我找到了一个解决方案,通过挂起线程并修改其指令指针寄存器,然后在恢复之前,在http://www.codeproject.com/KB/exception/ExcInject.aspx中在Windows中注入异常.但是,我还需要我的代码才能在Linux上运行.我如何在那里完成它?

如果我使用像getcontext()这样的东西,它获取当前线程的上下文(而在Windows中,GetContext()接受一个线程参数),所以我必须在信号处理程序中调用它.但是我已经读过不应该在信号处理程序中调用getcontext()/ setcontext()...或者,我可以直接在信号处理程序中调用rethrow_exception(),但我担心这不会产生预期的效果,中断的线程使堆栈以相同的方式展开,并且范围的所有析构函数都被调用等.

c++ multithreading signals exception code-injection

5
推荐指数
1
解决办法
1609
查看次数

WM_TOUCH 与 WM_POINTER

我应该使用哪一种?我只使用 Windows 8.x,所以我不关心 WM_POINTER 不向后兼容 Windows 7 等的事实。我也不关心手势;仅关于原始接触。WM_POINTER 唯一明显的优势似乎是它统一了触摸和鼠标输入(但使用 WM_TOUCH 很容易解决这个问题,因为可以使用 GetMessageExtraInfo() 检查鼠标事件)。易用性也不是问题;我一直在使用 WM_TOUCH,我只是想知道是否应该切换到 WM_POINTER。我最关心的是延迟和效率(与游戏相关的应用程序)。我不知道 WM_POINTER 是否是 WM_TOUCH 的包装器,它有额外的开销。任何意见?

winapi multi-touch touch windows-messages wm-touch

5
推荐指数
1
解决办法
3454
查看次数

类似于矢量的容器,可以使存储相互连续的实例?

我需要一个API尽可能接近std :: vector的容器类(除了没有重新分配),但是可以指定从现有缓冲区分配其元素的存储(而不是其成员变量,如size),以便我可以将所有向量的元素保存在连续的缓冲区中.也就是说,一个向量的.end()指向缓冲区中与下一个向量相同的元素.

我不知道我是否可以简单地使用带有std :: vector的自定义分配器,因为我无法找到有关是否为整个类分配存储的信息,包括大小和指针数据成员(在这种情况下我不能使用这种方法),或者只是它所拥有的数据元素(在这种情况下我可以使用它).

我只需要分配一个实例的存储空间,因此重新分配没有问题.我在这里发帖,看看是否已经发布了这样的容器,而不是从头开始重新实现大多数带有迭代器的std向量接口.


更新:我取消选中已发布的答案,因为它在Visual C++ 2012中的调试模式下不起作用.示例T= = float:

template<class T>
inline typename ContigAlloc<T>::pointer ContigAlloc<T>::allocate(std::size_t n)
{
    std::cout << "Alloc " << n << "; type match: " << std::boolalpha << std::is_same<T, float>::value << std::endl;
    return reinterpret_cast<T *>(_buff.alloc(T * sizeof(n)));
}

template<class T>
inline void ContigAlloc<T>::deallocate(T *p, std::size_t n) // TODO: noexcept when VC++2013
{
    std::cout << "Deall " << n << "; type match: " << std::boolalpha << std::is_same<T, float>::value << std::endl;
    _buff.dealloc(p, …
Run Code Online (Sandbox Code Playgroud)

c++ memory-management stl vector c++11

4
推荐指数
1
解决办法
348
查看次数

Nginx将客户端证书映射到REMOTE_USER以获取uWSGI并回退到基本身份验证?

我正在使用Nginx和uWSGI来服务Mercurial; 它通过SSL执行基本身份验证(Nginx是SSL终结器;它不会传递给Hg),但由于基本身份验证的安全性甚至超过SSL,如在包括此站点在内的各个地方所讨论的,我想允许用户也可以连接客户端证书,例如TortoiseHg支持的东西.

ssl_verify_client optional;
...
map $ssl_client_s_dn $ssl_client_s_dn_cn
{
    default "";
    ~/CN=(?<CN>[^/]+) $CN;
};
...
location /
{
    uwsgi_pass unix:/run/uwsgi/app/hgweb/socket;
    include uwsgi_params;
    uwsgi_param SERVER_ADDR $server_addr;
    uwsgi_param REMOTE_USER $ssl_client_s_dn_cn;
    #uwsgi_param REMOTE_USER $remote_user;
    #auth_basic "Mercurial repositories";
    #auth_basic_user_file /srv/hg/.htpasswd;
Run Code Online (Sandbox Code Playgroud)

}

所以我将CN视为用户名.但是,当没有客户端证书时,如何使其回退到基本身份验证(最好不是在有证书但验证失败时 - 在这种情况下只是错误)?我找到的一个例子是通过让一个单独的服务器块监听另一个端口,我想避免它:https://github.com/winne27/nginx-cert-and-basic-auth/blob/master/nginx-example .conf文件

此外,在一些例子中,我看到了以下检查location; 他们有必要吗?if ($ssl_client_verify != SUCCESS) { return 496; } if ($ssl_client_s_dn_cn !~ "^[a-z0-9]{1,10}$") { return 496; }鉴于http://wiki.nginx.org/IfIsEvil,我认为最好避免使用if.

ssl mercurial cgi nginx uwsgi

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

禁止对 MySQL/MariaDB 中的存储过程使用 NULL 参数

我可以指定表列不是 NULL,但是如何使存储过程或函数仅与非空参数兼容?在参数名称后添加 NOT NULL 不起作用。

mysql stored-procedures stored-functions mariadb

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