2013-09-28 12 views
0

我想知道是否有可能使用「原子訪問」(C++ 11功能)從注入到另一個進程的DLL內的多線程訪問。用std :: atomic <int>安全地連接到程序結構以進行線程訪問?

例如,我們有這樣的計劃:

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; 
    } 
} 

而且程序是封閉源代碼,但我disasemlbed了 「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? 
    } 
} 

會在std ::在我的「黑客」 DLL原子它運行它自己的線程,給安全多線程訪問主機進程中的全局變量? (因爲DLL正在主機進程中原子地訪問該值)?

回答

2

正式地,這個程序表現出未定義的行爲;您正在通過指向另一個不相關類型的指針來訪問一種類型的對象。

它也不會在實踐中工作。它需要兩個探戈:對於兩個線程來觀察標量對象的一致狀態,線程必須使用原子指令來訪問和修改它。這樣想一想:在增加一個計數器之前,你可能會獲得一個鎖,但是如果另一個線程增加了所述計數器而沒有先取得相同的鎖,那麼它就不會有任何好處。

在限制中,主機進程可能已將some_variable->value_a的值加載到寄存器中,並且根本沒有觀察到任何修改。

相關問題