小编Gra*_*Lup的帖子

旋转指令的目的是什么(ROL,x86上的RCL)?

我总是想知道一些CPU具有旋转指令的目的是什么(例如,ROL,x86上的RCL).什么样的软件使用这些说明?我首先想到它们可能用于加密/计算哈希码,但这些库通常用C编写,它没有映射到这些指令的运算符.
有没有人找到他们的用途?为什么他们在指令集中添加了哪些内容?

x86 assembly cpu-architecture machine-instruction

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

C++ 0x Lambda开销

在C++ 0x(在VS2010下)使用lambda表达式是否有任何开销?
我知道使用函数对象会产生开销,但我指的是传递给STL算法的表达式.编译器是否优化了表达式,消除了看起来像函数调用的东西?我开始非常喜欢lambda表达式,但我有点担心速度惩罚.

提前致谢!

c++ lambda visual-studio-2010 visual-c++-2010 c++11

26
推荐指数
2
解决办法
9504
查看次数

英特尔检查器报告我的螺旋锁实现中的数据竞争

我使用Windows中的Interlocked函数制作了一个非常简单的自旋锁,并在双核CPU上测试它(两个线程增加一个变量);

该程序似乎工作正常(它每次都给出相同的结果,但不使用同步时不是这种情况),但英特尔Parallel Inspector表示存在值+ = j的竞争条件(参见下面的代码).使用Critical Sections而不是SpinLock时,警告消失.

我的SpinLock实现是否正确?这真的很奇怪,因为所有使用的操作都是原子操作并且具有适当的内存屏障,并且不应该导致竞争条件.

class SpinLock
{
   int *lockValue;
   SpinLock(int *value) : lockValue(value) { }

   void Lock() {
      while(InterlockedCompareExchange((volatile LONG*)lockValue, 1, 0) != 0) {
          WaitABit();
      }
   }

   void Unlock() { InterlockedExchange((volatile LONG*)lockValue, 0); }
};
Run Code Online (Sandbox Code Playgroud)

测试程序:

static const int THREADS = 2;
HANDLE completedEvents[THREADS];
int value = 0;
int lock = 0; // Global.

DWORD WINAPI TestThread(void *param) {
    HANDLE completed = (HANDLE)param;
    SpinLock testLock(&lock);

    for(int i = 0;i < 1000*20; i++) …
Run Code Online (Sandbox Code Playgroud)

c++ winapi synchronization spinlock intel-inspector

8
推荐指数
1
解决办法
2754
查看次数

Static const member initialization in templated class

I have a problem regarding 'static const' member initialization. In a templated class I define a const member and initialize it outside the class.
When I include the .h file where this class is implemented in multiple .cpp files, I get an LNK2005 error (I'm using VS2010) that says the constant is already defined.

// List.hpp
template <class T>
class List {
    static const double TRIM_THRESHOLD;
};

template <class T>
const double List<T>::TRIM_THRESHOLD = 0.8;
Run Code Online (Sandbox Code Playgroud)

我尝试将成员初始化放在.cpp文件中,但后来我得到一个链接器错误,说根本没有定义常量.如果列表没有模板化,我将初始化放在.cpp文件中,一切都很好.
这种情况有什么解决方案吗?我已经在文件周围有#ifdef/define子句,这绝对不是解决方案.

c++ static const visual-c++-2010

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

拦截C#中应用程序中所有控件的单击事件(WinForms)

我想创建一个应用程序来截取我的应用程序的所有形式的所有UI事件,并将它们写入日志.这些数据可以用于查看哪些控件使用最多,顺序是什么等.问题是我希望这是自动发生的,而不需要修改现有的类.

我制作了一个原型,将一个方法附加到表单中所有控件的click事件,但是如何对所有表单执行此操作?在操作事件时,Reflection需要一个目标对象,但只能轻松访问启动表单.

有没有办法挂钩对象的构造函数?然后我可以在新表格的所有事件中"注入"我的方法.或许还有另一种方法可以做到这一点.

提前致谢!

.net c# events winforms interception

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

获取NUMA系统中的节点距离(跳数)

是否有任何API /方法可以获得两个NUMA节点之间的"距离"(在文献中称为"跳跃")?我想实现一个利用这个的内存分配系统(从最近的节点重用内存,因为访问速度更快).
Windows似乎没有这样的功能......并且libnuma(在Linux下)似乎也没有.有没有办法获得这些信息(甚至有'cpuid'之类的东西)?

c++ linux memory windows numa

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

Graphviz Dot中奇怪的边缘位置

我有一个模块,可以自动输出(以点格式)用某种汇编语言编写的函数(我的编译器的IR).节点是使用"记录"形状打印的基本块.问题是边缘采取了奇怪的路线,例如:

digraph {
node [shape = record];
n0[label="{<name> entry | <body> store i, 0\nstore sum, 0\ngoto test | {<target> target}}"];
n1[label="{<name> test | <body> t2 = load i\nif t4, body,   done | {<true> true | <false> false}}"]
n2[label="{<name> body | <body> t5 = load sum\ngoto test | {<target> target}}"];
n3[color=firebrick3, label="{<name> done | <body> t9 = load sum\nret t9}}"];
n0:target:s -> n1:name:n
n1:true:s -> n2:name:n
n1:false:s -> n3:name:n
n2:target:s -> n1:name:n
}
Run Code Online (Sandbox Code Playgroud)

和图像:

http://img529.imageshack.us/img529/3780/graphviz.png

我能做什么,以便从"目标"到"测试"的边缘放在左侧?

graph-theory graph graphviz

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

首次请求时Amazon SimpleDB高延迟

我在桌面应用程序(C#,.NET 2.0)中使用SimpleDB,并且存在高延迟问题.
我第一次向DB发出请求(查询,插入值 - 无关紧要)我只在大约10-20秒后得到响应.这种情况只在第一次发生,其余的响应非常快(没有测量,但肯定在300ms以下).
当我创建数据库客户端时,只有在我执行第一个请求时才会发生这种情况.身份验证是否正常缓慢?(我认为在第一次请求身份验证完成时).

提前致谢.

编辑

当我第一次跑的时候

SelectResponse response = dbService_.Select(request);
Run Code Online (Sandbox Code Playgroud)

在输出面板中我得到:

'PhotoExchange.vshost.exe' (Managed (v2.0.50727)): Loaded'C:\Windows\assembly\GAC_MSIL\System.Data.SqlXml\2.0.0.0__b77a5c561934e089\System.Data.SqlXml.dll'
'PhotoExchange.vshost.exe' (Managed (v2.0.50727)): Loaded 'System.Xml.Xsl.CompiledQuery.1'
'PhotoExchange.vshost.exe' (Managed (v2.0.50727)): Loaded 'System.Xml.Xsl.CompiledQuery'
 A first chance exception of type 'System.IO.FileNotFoundException' occurred in mscorlib.dll
'PhotoExchange.vshost.exe' (Managed (v2.0.50727)): Loaded 'rg1d4wjc'  
Run Code Online (Sandbox Code Playgroud)

这是正常的吗?该FileNotFoundException异常看起来很奇怪.

.net c# amazon-web-services amazon-simpledb

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

线程被销毁时的通知

有没有办法在应用程序中获取线程不再运行(已返回)的通知?
我知道这在内核模式下是可行的(使用PsSetCreateThreadNotifyRoutine),但有没有办法从用户模式知道这一点,只使用Win32 API?

问题是我无法控制线程中的代码,因为我的模块是库的一部分.让驱动程序监控系统不会太难,但即使对于使用我的库的基本应用程序,用户安装驱动程序也很烦人.

我的代码使用TLS存储,在Linux/Unix下,pthread_key_create可以获取指向线程被销毁时调用的函数的指针.但是TlsAlloc(Windows)没有这样的......

提前致谢!

c++ winapi multithreading

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

我可以使用互锁操作来更新多个值以避免锁定关键部分/互斥锁吗?

我有一个多线程应用程序(C++),我需要增加/更改一系列值.如果我使用一系列互锁操作,它们被认为是单个原子操作吗?就像在这个例子中:

InterlockedIncrement(&value1);
InterlockedIncrement(&value2);
InterlockedExchange(&oldValue, newValue);
Run Code Online (Sandbox Code Playgroud)

或者我们更好地锁定以执行同步?像这样:

EnterCriticalSection(&cs);
value1++;
value2++;
oldValue = newValue;
LeaveCriticalSection(&cs);
Run Code Online (Sandbox Code Playgroud)

我认为需要一个锁定,但我不确定......所有的值要么处于旧状态,要么处于新状态,这一点非常重要.

c++ multithreading synchronization interlocked-increment

3
推荐指数
1
解决办法
451
查看次数