0

別のプロセスに挿入された DLL 内からのマルチスレッドアクセスに「アトミックアクセス」(C++11 機能) を使用できるかどうか疑問に思っています。

たとえば、次のプログラムがあります。

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

独自のスレッドを実行する「ハック」dll の std::atomic は、ホスト プロセスのグローバル変数への安全なマルチスレッド アクセスを提供しますか? (DLLがホストプロセスでアトミックに値にアクセスしているためですか?)

4

1 に答える 1

2

正式には、このプログラムは未定義の動作を示します。関係のない別の型へのポインターを介して、ある型のオブジェクトにアクセスしています。

実務でも通用しません。タンゴには 2 つかかります。2 つのスレッドがスカラー オブジェクトの一貫した状態を監視するには、両方のスレッドがアトミック命令を使用してアクセスし、変更する必要があります。このように考えてみてください: カウンターをインクリメントする前にロックを取得することはできますが、最初に同じロックを取得せずに別のスレッドがそのカウンターをインクリメントすると、何の役にも立ちません。

制限内では、ホスト プロセスが の値をレジスタにロードした可能性がsome_variable->value_aあり、変更をまったく監視していません。

于 2013-09-28T14:36:01.277 に答える