使用std :: atomic <int>安全地连接到程序结构以进行线程访问?</int>

时间:2013-09-28 13:55:49

标签: c++ multithreading dll c++11 shared-memory

我想知道是否可以使用“原子访问”(C ++ 11特性)从注入另一个进程的DLL中进行多线程访问。

例如,我们有这个程序:

struct SSomeStructure
{
    int value_a;
    int value_b;
};

int main()
{
    SSomeStructure some_variable;
    while(!GetAsyncKeyState('Q'))//loop while Q is not pressed
    {
        std::cout << some_variable.value_a << some_variable.value_b;
        some_variable.value_a = GetTickCount();
        some_variable.value_b = -some_variable.value_a;
        std::cout << some_variable.value_a << some_variable.value_b;
    }
}

该程序是封闭源程序,但我已经废除了“SSomeStructure”结构:

struct SSomeStructure
{
    int value_a;
    int value_b;
};

现在我正在编写一个将被注入到进程中的DLL,但除了std :: out之外没有什么可以挂钩的,因此,没有挂钩但是创建另一个线程,安全地访问/修改这些变量,它们需要原子,对吧?

所以我想在我的(伪代码)DLL中创建它:

#include <atomic>
#include <thread>

//disasembled structure, but added syd::atomic
struct SSomeStructure
{
    std::atomic<int> value_a;
    std::atomic<int> value_b;
};

//start thread when dll loads etc...

void SomeThread()
{
    SSomeStructure * some_variable = ObtainAddressOfSomeVariableFromHostProcess();
    while(true)
    {
        some_variable->value_a = 1337;//is this now an atomic operation which is thread-safe?
    }
}

我的“hack”dll中的std :: atomic会运行它自己的线程,在主机进程中提供对全局变量的安全多线程访问吗? (因为DLL正在主机进程中以原子方式访问该值?)

1 个答案:

答案 0 :(得分:2)

正式地,该程序表现出不确定的行为;您正通过指向另一个不相关类型的指针访问一种类型的对象。

它也无法在实践中发挥作用。探戈需要两个:要让两个线程观察标量对象的一致状态,两个线程必须使用原子指令来访问和修改它。这样考虑一下:你可以在增加一个计数器之前锁定一个锁,但是如果另一个线程在不先取相同锁的情况下递增所述计数器,它对你没有任何好处。

在限制中,主机进程可能已将some_variable->value_a的值加载到寄存器中,并且根本没有观察到任何修改。