【发布时间】:2013-09-28 13:55:48
【问题描述】:
我想知道是否可以将“原子访问”(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 在宿主进程中以原子方式访问值?)
【问题讨论】:
标签: c++ multithreading dll c++11 shared-memory