1

我在 LabWindows/CVI 环境中使用线程安全变量宏,并观察到可以在线程安全变量被释放之前获得一个指针。(来自先前的请求)

因为我感兴趣保护的数据是 a struct,所以我无法显式设置嵌套级别,所以我假设嵌套级别保持在 0,即一旦发出单个线程安全指针,第二个请求将被拒绝直到第一个被释放。但是,在单步调试会话时,我发现这不是真的。DefineThreadSafeVar(CLI, SafeCli);通过继续使用 F8步入键继续执行语句,随后对指向线程安全变量的指针的请求被授予,而无需释放原始变量。

我的期望是,一旦发出指向线程安全变量的指针但尚未释放 ,这些宏应该会阻止访问

我的期望不正确吗?
还是我错误地执行了调用?

这是我的源代码:

#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 中被调用,然后在线程 B 中再次ReleasePointerToSafeCli()被调用,则在线程 A 中被回调之前,线程 B 将等到指针被释放后再授予访问权限。

LabWindows/CVI - 使用 DefineThreadSafeScalarVar 编程

于 2016-01-04T18:24:43.950 回答