另一周,我写了一个小线程类和一个单向消息管道,以允许线程之间的通信(每个线程两个管道,显然,用于双向通信).在我的Athlon 64 X2上一切正常,但我想知道如果两个线程都在查看相同的变量并且每个核心上的此变量的本地缓存值不同步,我是否会遇到任何问题.
我知道volatile关键字会强制变量从内存中刷新,但多核x86处理器是否有办法强制所有内核的缓存同步?这是我需要担心的事情,还是易失性和正确使用轻量级锁定机制(我使用_InterlockedExchange设置我的易失性管道变量)处理我想为多核x86 CPU编写"无锁"代码的所有情况?
我已经知道并使用了Critical Sections,Mutexes,Events等等.我主要想知道是否有x86内在函数,我不知道哪种力量或可用于强制缓存一致性.
我正在尝试在 Direct3D 中将 2D 图像绘制到屏幕上,我假设必须通过将纹理映射到投影以填充屏幕的矩形广告牌多边形来完成。(我不感兴趣或不能使用 Direct2D。)我在 SDK 中找到的所有纹理信息都描述了从文件加载位图并分配纹理以使用该位图,但我还没有找到操作的方法一个像素一个像素的位图纹理。
我真正想要的是一个函数,例如
void TextureBitmap::SetBitmapPixel(int x, int y, DWORD color);
如果我不能直接在纹理对象中设置像素,我是否需要保留一个作为位图的 DWORD 数组,然后将纹理分配给每一帧?
最后,虽然我最初假设我将在 CPU 上执行此操作,但每像素颜色计算可能也可以在 GPU 上完成。HLSL 代码是设置纹理中单个像素的颜色,还是像素着色器仅用于修改显示像素?
谢谢。
我被一个错误所困,部分原因在于我缺乏理解,部分原因是我认为我们的代码库中设计欠次优.我很好奇我的5分钟解决方案是如何改进的.
我们使用的是ref-counting对象,我们在这些类的对象上有AddRef()和Release().一个特定的对象是从ref-count对象派生的,但是获取这些对象的实例(GetExisting)的常用函数会在其自身内部隐藏AddRef()而不会通知它正在这样做.这需要在功能块的末尾执行Release以释放隐藏的ref,但是没有检查GetExisting()的实现的开发人员不会知道这一点,并且忘记在最后添加Release的人这个函数(比如说,在一个疯狂的bug修复关键时刻)泄漏了对象.当然,这是我的烧伤.
void SomeFunction(ProgramStateInfo *P)
{
ThreadClass *thread = ThreadClass::GetExisting( P );
// some code goes here
bool result = UseThreadSomehow(thread);
// some code goes here
thread->Release(); // Need to do this because GetExisting() calls AddRef()
}
Run Code Online (Sandbox Code Playgroud)
所以我编写了一个小类来避免在这些函数结束时需要Release().
class ThreadContainer
{
private:
ThreadClass *m_T;
public:
ThreadContainer(Thread *T){ m_T = T; }
~ThreadContainer() { if(m_T) m_T->Release(); }
ThreadClass * Thread() const { return m_T; }
};
Run Code Online (Sandbox Code Playgroud)
所以现在我可以这样做:
void SomeFunction(ProgramStateInfo *P)
{
ThreadContainer ThreadC(ThreadClass::GetExisting( P ));
// some code goes …Run Code Online (Sandbox Code Playgroud)