1

LabWindows/CVI 環境でスレッド セーフ変数マクロを使用していますが、解放される前にスレッド セーフ変数へのポインターを取得できることがわかりました。(前回のリクエストより)

私が保護しようとしているデータは であるため、structネスト レベルを明示的に設定することはできません。したがって、ネスト レベルは 0 のままであると仮定します。つまり、単一のスレッド セーフ ポインタが発行されると、2 番目のリクエストは拒否されます。第一弾が発売されるまで。ただし、デバッグ セッションをステップ実行しているときに、これが当てはまらないことがわかりました。F8ステップインDefineThreadSafeVar(CLI, SafeCli);キーを使用し続けることでステートメントの実行が続行され、スレッド セーフ変数へのポインターに対する後続の要求は、元の変数を解放することなく許可されます。

私の予想では、これらのマクロは、スレッドセーフ変数へのポインターが発行され、まだ解放されていない場合、その変数へのアクセスを防止する必要があります。

私の期待は間違っていますか?
または、呼び出しを正しく実装していませんか?

ここに私のソースコードがあります:

#include <utility.h>

typedef struct  {
    int hndl;
    int connect;
    int sock;
}CLI;

DefineThreadSafeVar(CLI, SafeCli);

void func1(void);
void func2(void);

int main(void)
{
    InitializeSafeCli(); 
    func1();

    return 0;
}

void func1(void)
{
    CLI *safe;
    safe = GetPointerToSafeCli();//original issue
    safe->connect = 2;
    safe->hndl = 3;
    safe->sock = 4;
    func2();
    safe->connect;
    safe->hndl;
    safe->sock;
    ReleasePointerToSafeCli();
}

void func2(void)
{
    CLI *safe;
    safe = GetPointerToSafeCli();//request is granted. previous issue had not been released.  
                                 //shouldn't request have been denied ?
    safe->connect = 5;//variable is modified.
    safe->hndl = 6;
    safe->sock = 7;
}
4

1 に答える 1

2

あなたの場合、あなたは呼び出しを行っており、その後は同じ呼び出しスタックfunc2()func1()、つまり同じスレッド内にあります。既にポインターにアクセスできる同じスレッド内からポインターを要求しているため、アクセスが許可されます。

GetPointerToSafeCli()ウェイティングコールです。スレッド A から呼び出され、スレッド A で呼び出される前にスレッド B で再度ReleasePointerToSafeCli()呼び出された場合、スレッド B はアクセスを許可する前にポインターが解放されるまで待機します。

LabWindows/CVI - DefineThreadSafeScalarVar を使用したプログラミング

于 2016-01-04T18:24:43.950 に答える