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